在密钥库中包括用于相互SSL的中间链

时间:2018-09-24 22:55:06

标签: java ssl apache-httpclient-4.x

我已经呆了很久了,一直在寻找解决方案。

我正在尝试进行双向SSL。目标使用由有效且受信任的中间人签名的证书。我这一边,一个使用httpclient 4.3.6的Java Web服务客户端,也在使用由中间人签名的证书。

该中间体位于JKS格式的密钥库中,并具有完整的链。我的证书也在JSK密钥库中。

我也正在运行Wireshark来遵循SSL流程,因为Java异常非常无用。我可以看到Server Hello完成了(Wireshark中的一行称为“ Server Hello,证书,服务器密钥交换,证书请求,Server Hello完成”)。几包之后,有一条“证书,客户端密钥交换”行,似乎可以正常运行。两个数据包之后,出现有关握手失败的警报(40)。当我向“证书,客户密钥交换”行退回两个数据包并仔细检查时,我可以看到,在发送密钥后,数据包检查窗口中有一行显示“证书长度:0”。

因此看来我的证书甚至没有被发送?我在这里看到另一个问题,这可能是因为我这一边没有看到通往我的证书的有效路径,所以不麻烦包括它吗? (答案为https://stackoverflow.com/a/14876605/5136448)。当使用SSLContext和SSLConnectionSocketFactory时,我的确包含其中包含我的中间层的信任库。

我的一个同事在将我的密钥库和中间库一起使用时,使用openssl成功建立了连接,因此我试图将证书密钥从中间密钥库添加到我自己的密钥库中,以查看是否可以解决该问题。我找不到任何成功的方法(openssl,keytool,Keystore Explorer),因此我可能没有正确解决此问题的正确方法。

总而言之,使用Apache http-client 4.3.6,我需要对服务器受信任的服务器执行双向SSL,但是客户端似乎没有发送其证书(该证书是由同一人签名的)签署服务器证书的实体。

应该相关,这是客户端代码:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File("/path/to/test.keystore")), "abc123".toCharArray());

KeyStore trustStore = KeyStore.getInstance("PKCS12");
trustStore.load(new FileInputStream(new File("/path/to/test.truststore")), "123abc".toCharArray());

SSLContext sslContext = SSLContexts
.custom()
.loadKeyMaterial(keystore, "abc123".toCharArray(), null)
.loadTrustMaterial(trustStore, null)
.build();

SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);


CloseableHttpClient httpclient1 = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();

0 个答案:

没有答案