3

Load Balancer の背後にある Tomcat インスタンスにデプロイされた Web サービスを公開しました。Load-Balancer は HTTPS トラフィックのみを許可しますが、Jax-ws エンドポイントは HTTPS ではなく HTTP WSDL URL を指します。クライアントがロードバランサの HTTPS URL にアクセスすると、HTTP にリダイレクトされます。HTTP のトラフィックは LB でブロックされているため、クライアントは WSDL にアクセスできないというエラーを受け取ります。

Sun-jaxws.xml または webservice アノテーションに、HTTP ではなく HTTPS URL を公開するように JAX-WS に指示するように指定する構成はありますか。

以下は私の設定です:

sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints
xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
version='2.0'>
<endpoint
    name='/TestService'
    implementation='com.test.service.TestServiceImpl'
    url-pattern='/TestService' />    

Annotation Config On WebService Impl class:

@WebService(serviceName="TestServiceImpl",
portName="TestService",
endpointInterface = "com.test.service.TestService",
targetNamespace="http://test.com"
)
@HandlerChain(file = "handlers.xml")
@MTOM
@XmlAccessorType(XmlAccessType.PROPERTY)
public class TestServiceImpl implements TestService{
//Implementation
}

WebService エンドポイント。HTTPS プロトコルはブラウザで、HTTP は WSDL ロケーション URL で確認してください。セキュリティ上の理由により、サービスと URL を削除しました。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.

さまざまなシナリオでのソリューションについてもコメントをお読みください

4

2 に答える 2

2

私はそのアプローチをお勧めしません - より良いオプションは、ロードバランサーで SSL 通信を終了し、ロードバランサーとサーバーの間でプレーンな HTTP を使用することです (バランサーとサーバーの間のトラフィックも保護する必要がある場合を除きますが、私はそれを疑っています) )。つまり、2 つの場所で SSL をセットアップする必要がなく、何かが正常に機能しない場合に二重の頭痛の種になります。したがって、最初にロード バランサをそのように構成してみてください。<soap:address location="..">さらに、手動で WSDL のタグを書き換え(もちろん HTTPS アドレスを追加)、ローカルに保存された WSDLから WS クライアントを生成する必要があります。

それでも Tomcat で SSL をセットアップしたい場合は、最初にキーストア (鍵と証明書の「データベース」) をセットアップする必要があります。Web にはその方法に関する多くのチュートリアルがあり、そのうちの 1 つがここにあります。次に、次のスニペットを追加して、Tomcat の server.xml ファイルを変更する必要があります。

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="<PATH-TO-KEYSTORE>" keystorePass="<YOUR-KEYSTORE-PASSWORD>"
           clientAuth="false" sslProtocol="TLS"/>

最後に、Web サービスがすべての HTTP 要求を HTTPS リスナーにリダイレクトするように指定する必要がありますが、sun-jaxws.xml ではなく web.xml ファイルで指定する必要があります。

<user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

Tomcat を再起動すると、それが実行されるはずです。

于 2013-03-25T07:54:54.463 に答える
2

別の方法は、Tomcat の「server.xml」ファイルに次のような行を追加することです。

<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" 
    connectionTimeout="20000"  scheme="https" proxyPort="443"
    redirectPort="8443" />

そして、この場合、HTTP を使用して LB をポート 8080 に向けます。

これは、クライアントがポート 443 への HTTPS を使用して LB に接続し、LB がポート 8080 への HTTP を使用してサーバーに接続する場合に機能します。その場合、WSDL は戻ります。

<soap:address location="https://www.yoursite.com:443/...">

大切なものがある

scheme: この属性を、 request.getScheme() の呼び出しによって返されるプロトコルの名前に設定します。たとえば、SSL コネクタの場合、この属性を「https」に設定します。デフォルト値は「http」です。

proxyPort: このコネクターがプロキシー構成で使用されている場合、この属性を構成して、request.getServerPort()への呼び出しで返されるサーバー・ポートを指定します。

太字のメソッドは両方とも、Jax-ws が soap:address を作成するために使用します。

これを手伝ってくれたチノに感謝します!

于 2013-03-27T21:27:29.123 に答える