我需要向使用TLS客户端身份验证的服务器发送一个请求,为此,我创建了一个包含证书和私钥的PKCS 12文件,并在SSLContext中将其设置为KeyManager。
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystoreInputStream = new FileInputStream("C:/Users/PC/Desktop/certprivate.p12");
keystore.load(keystoreInputStream, "password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore, "password".toCharArray());
SSLContext sc = SSLContext.getInstance("TLSv1.3");
sc.init(kmf.getKeyManagers(), null, null);
我还使用keytool从cacerts
存储中的服务器添加证书,虽然这不起作用,但我使用InstallCerts下载了我猜所有的中间证书并在cacerts中安装了这些证书。
我不知道为什么会出现这种情况,据我所知,如果TrustManager
设置为null,它将使用默认的TrustManager,在本例中为:
String certificatesTrustStorePath = "C:/Program Files/Java/jdk-15.0.2/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
编辑:我不明白为什么TLS握手已经完成了,请求却失败了。否则我会得到一些其他的错误/异常。
2条答案
按热度按时间ibps3vxo1#
添加-Djavax .NET.debug=all到你的java启动命令行,你会得到更多的信息。在你可以诊断你的问题之后。JC
nhaq1z212#
我可能会晚一点给出一个可能的答案。但是我遇到了同样的问题,根据我的经验,由于在设置SSLContext时的一些问题,假设在Java 11中没有专门为我选择trustStore和keyStore。所以我必须使用JVM参数来设置它们。但是设置trustStore和keyStore是不够的,请为他们两个设置密码。2这对我很有效。3另外我还设置了TLSv1.2的TLS协议。4我希望这能有所帮助。