首页 > 编程知识 正文

java https 验证客户端证书_Java HTTPS客户端证书认证

时间:2023-05-05 17:04:40 阅读:54237 作者:1868

小典典

终于解决了所有的问题,我来回答自己的问题。 这些是我用来解决特定问题的设置/文件;

客户端的密钥库包含在PKCS#12格式的文件中

客户端的公共证书(在这种情况下,由自签名CA签名) )。

客户端私钥

为了生成它,我使用了OpenSSL的pkcs12命令。

OpenSSL pkcs12-export-in client.CRT-inkey client.key-out client.p12-name ' whatever '

提示:获取最新的OpenSSL,而不是0.9.8h版。 这似乎有错误,因此无法正确生成PKCS#12文件。

如果服务器明确请求客户端认证,Java客户端将使用此PKCS#12文件向服务器提供客户端证书。 有关客户端证书认证协议的实际工作原理的概述,请参阅TLS维基百科文章。 这里还介绍了为什么需要客户端私钥。

客户端信任是包含文件的根证书或中间CA证书。 这些CA证书确定允许与哪个端点进行通信。 在这种情况下,客户端可以连接到提供由受信任库中的CA之一签名的证书的任何服务器。

要生成它,请使用标准的Java键盘工具,例如:

keytool-genkey-dname ' cn=client '-aliastruststorekey-keyalg RSA-keystore./client-trust store.jks-keypasswhs

keytool-import-keystore./client-trust store.jks-filem yca.CRT-aliasmyca

使用此信任库,客户端将尝试与提供由标识的CA签名的证书的所有服务器进行完整的SSL握手myca.crt。

上面的文件只适用于客户端。 此外,设置服务器时,服务器必须有自己的密钥和信任库文件。 在此网站上,您可以找到有关使用Tomcat将Java客户端和服务器配置为完全正常工作的示例的出色练习。

问题/评论/提示

客户端证书的认证只能由服务器执行。

重要提示! 如果服务器请求客户端证书作为TLS握手的一部分,则证书请求还会提供受信任的CA列表。 如果您尝试提供的验证客户端证书不是由这些CA之一签名的,则根本不会提供(这似乎是一种奇怪的行为,但我确信是有原因的)。 这是因为另一个服务器没有正确配置为接受自签名客户端证书,请求中没有正确提供客户端证书,所以我认为我这边出现了问题。

获取Wireshark。 具有良好的SSL/HTTPS数据包分析功能,有助于调试和发现问题。 - d javax.net.debug=如果对ssljavassl调试输出不满意,则类似,但更结构化,更容易说明。

可能使用Apache http客户端库。 如果使用HTTPS客户端,则只需将目标URL替换为等效的HTTPS并添加以下JVM参数: 无论通过HTTP/HTTPS发送和接收数据的库如何,它都与其他客户端相同。

-Djavax.net.debug=ssl

- d javax.net.SSL.keystore type=pkcs12

- d javax.net.SSL.keystore=client.p12

- d javax.net.SSL.keystore password=whatever

- d javax.net.SSL.trust storetype=jks

- d javax.net.SSL.trust store=client-trust store.jks

- d javax.net.SSL.trust store password=whatever

2020-03-01

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。