web-dev-qa-db-ja.com

サーバーがクライアント証明書を予期しているときにwsimportを使用するにはどうすればよいですか?

相互SSL認証を使用するWebサービスがあります。クライアントの証明書をインストールすると、ブラウザで問題なくアクセスできます。

サービスにアクセスするためのJavaコードを生成するには、wsimportを使用してこれにアクセスできる必要があります。

wsimportを使用してURLにアクセスできるように、資格情報を設定するにはどうすればよいですか?

これが私が試していることの例ですが、認証できないためにタイムアウトします。

wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders

助けてくれてありがとう

編集:

これはwsimportが出力するものです。 WSDLは間違いなく有効であり、指定された場所で、認証のために資格情報を渡す方法を理解する必要があります。

wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile 
-d ./src -extension -keep -XadditionalHeaders


parsing WSDL...

[ERROR] Received fatal alert: handshake_failure

Failed to read the WSDL document: "https://wsdl.location.com?WSDL", because 1) could 
not find the document; /2) the document could not be read; 3) the root element of 
the document is not <wsdl:definitions>.

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

 At least one WSDL with at least one service definition needs to be provided.

    Failed to parse the WSDL.
10
Cuga

WsImport Java class( source ))を直接呼び出し、Javaクライアントを探す場所を知っている)に必要なJVMの引数を追加できます。証明書。

何かのようなもの

Java -classpath C:\jdk160_29\lib\tools.jar -Djavax.net.ssl.trustStore=c:\jdk160_29\.mykeystore com.Sun.tools.internal.ws.WsImport https://Host:8443/Webservice?wsdl -p com.test -s ./src"

トリックを行う必要があります。

9
David Silva

通過するすべての追加のシステムプロパティを使用して_Java_OPTIONS環境変数を設定することでこれを行うことができました。 Windowsバッチファイルとしては、次のようになります(必要に応じてパスワードを入力します。

setlocal
set _Java_OPTIONS=%_Java_OPTIONS% -Djavax.net.ssl.trustStore="%Java_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} -Djavax.net.ssl.keyStore=r:\cert.pfx
wsimport -s . -verbose https://your.Host.name/path/to/service?wsdl
endlocal

正気のために、長い 'set'行のJavaオプションは次のとおりです。

-Djavax.net.ssl.trustStore="%Java_HOME%\jre\lib\security\cacerts"
-Djavax.net.ssl.keyStoreType=PKCS12
-Djavax.net.ssl.keyStorePassword={...passwordForThePFX...}   
-Djavax.net.ssl.keyStore=R:\cert.pfx

trustStore設定を指定する必要がある場合とない場合があります。いくつかのインストールがあり、Javaが間違ったcacertsファイルを取得していたので、そうしなければなりませんでした。

同様に、キーストアがパスワードで保護されていない場合は、keyStorePasswordは必要ありません。 keyStoreTypeに関しては、Javaキーストアにアクセスしていない場合はこれを指定する必要があります。

最終的に、唯一の「必須」オプションは、クライアント証明書とキーが存在する場所を定義するkeyStoreです(クライアント証明書がコアJava証明書ストアのいずれにも存在しない場合にのみ必須です)。 。現状では、上記の例は、Windows証明書ストアからエクスポートして生成されたPFXファイル内のクライアント証明書の場合です。

4
Chris J

私ははるかに簡単であることがわかりました(-D、クラスパスなどで遊ぶ必要はありません):
1。ブラウザでsslを介してwsdlをダウンロードする(キーストアをダブルクリックしてデフォルトのブラウザに証明書をインストールする)か、wsdlの内容を表示するsoapUI(config/sslを介してキーストアをインストールする)を使用するとさらに簡単になります
2。ダウンロードしたwsdlに対してwsimportを実行します
それで全部です。

2
Marc T