2

接続する必要のあるWSの1つに、PHPのサンプルコードがあります。それらは私たちのCSRのために署名されています...したがって、認証用の秘密鍵と証明書があります。

彼らは、PRIVATE KEYと署名付き証明書の両方を1つの.pemファイルに入れ、PHPで次のようなコードを作成することを提案しています。

$client = new SoapClient('https://www.example.com/api/server.php?wsdl', array('local_cert' => "custom-pc.pem", "trace"=>1));
$result = $client->Login();

そしてそれはうまくいきます。

ただし、ここではPHPの達人ではなくJavaを使用しているため、PRIVATE KEYとCERTIFICATEの両方をcacertsにインポートしました(PKCS12にエクスポートしてからキーストアをマージしました)。

openssl pkcs12 -export -in signed.pem -inkey server.key -out signed.p12 -name custom -CAfile ca.crt -caname root
sudo keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore /Library/Java/JavaVirtualMachines/jdk1.7.0_06.jdk/Contents/Home/jre/lib/security/cacerts -srckeystore signed.p12 -srcstoretype PKCS12 -srcstorepass changeit -alias custom

しかし、運がない:(

常に例外が発生しました:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1977)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1093)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)

私たちが何を間違えたのか分かりますか?

4

1 に答える 1

1

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
これは通常、サーバーにアクセスできない場合に発生します。おそらくファイアウォールの問題?
クライアントを実行するjava -Djavax.net.debug=sslか、wireshark を介してハンドシェイクを確認して、問題がどこにあるかを把握できます。

于 2013-01-02T22:37:52.310 に答える