PHP SoapClient,带有Java中的自签名证书

时间:2013-01-02 19:25:11

标签: java php web-services ssl openssl

我们需要连接的WS之一是PHP中的示例代码。 它们是为我们签署的CSR ...因此我们现在拥有PRIVATE KEY和CERTIFICATE进行身份验证。

他们建议将两个,PRIVATE KEY和签名的CERTIFICATE放到一个.pem文件中,并在PHP中使用这样的代码:

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

并且工作正常。

但是我们在这里使用Java,没有PHP专家 - 所以我将USER 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)

知道我们做错了什么?

1 个答案:

答案 0 :(得分:1)

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
当服务器不可用时,通常会遇到这种情况。也许防火墙问题?
您可以使用java -Djavax.net.debug=ssl运行您的客户端,或通过wireshark查看握手以了解问题所在的位置