相互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.
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"
トリックを行う必要があります。
通過するすべての追加のシステムプロパティを使用して_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ファイル内のクライアント証明書の場合です。
私ははるかに簡単であることがわかりました(-D、クラスパスなどで遊ぶ必要はありません):
1。ブラウザでsslを介してwsdlをダウンロードする(キーストアをダブルクリックしてデフォルトのブラウザに証明書をインストールする)か、wsdlの内容を表示するsoapUI(config/sslを介してキーストアをインストールする)を使用するとさらに簡単になります
2。ダウンロードしたwsdlに対してwsimportを実行します
それで全部です。