我们需要连接的 WS 之一有 PHP 中的示例代码。他们为我们签署了 CSR ......所以我们现在有 PRIVATE KEY 和 CERTIFICATE 进行身份验证。
他们建议将 PRIVATE KEY 和 signed 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 专家——所以我将 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)
知道我们做错了什么吗?