现象: 调https地址,一直报错:javax.xml.ws.soap.SOAPFaultException: Authentication failed 该地址需要私钥证书,貌似证书没有生效
胡乱改了若干遍,毫无头绪。
后来,java命令加了-Djavax.net.debug=all,详细看了https的握手过程,
握手大概过程就是: ----------- 互相Hello一下,然后协商用什么算法加密数据。 然后服务端管客户端要证书。 客户端发证书过去,服务端找,看哪个合适,找到了就用证书,没找到就走没证书的流程 --------------------- 好使的那个程序:在 *** ServerHelloDone 阶段,服务端返回了 matching alias: client
这里的client是客户端私钥的别名。 keytool -v -list -keystore 你的客户端证书.jks 可以看别名。 --------------------- 不好使的程序:返回了Warning: no suitable certificate found - continuing without client authentication --------------------- 所以,想到是程序没有找到私钥。 突然想起keyStore和trustStore区别来。
keyStore是告诉JVM,客户端私钥在哪。 trustStore是告诉JVM,服务端的公钥再哪。
加上以下两句: System.setProperty("javax.net.ssl.keyStore", "D:\\AAAAAAAA\\myClient.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "123456");
瞬间好使了。
|