Java HTTPS客户端证书认证

tmbrggmn:

我还很陌生,对于HTTPS/SSL/TLS使用证书进行身份验证时客户端应该显示的内容有些困惑。

我正在编写一个Java客户端,该客户端需要对POST特定对象进行简单的数据处理URL那部分工作正常,唯一的问题是应该完成HTTPSHTTPS部分相当容易处理(无论是HTTPclient使用Java的内置HTTPS支持还是使用Java的内置支持),但是我一直坚持使用客户端证书进行身份验证。我注意到这里已经存在一个非常类似的问题,我还没有尝试使用我的代码(很快就会这样做)。我当前的问题是-无论做什么,Java客户端都永远不会发送证书(我可以通过PCAP转储检查它)。

我想知道在使用证书进行身份验证时,客户端到底应该向服务器呈现什么(特别是对于Java,如果有的话)?这是JKS文件PKCS#12吗?里面应该有什么?只是客户证书还是密钥?如果是这样,哪个键?关于所有不同类型的文件,证书类型等,都存在很多困惑。

正如我之前刚接触过的内容所说的HTTPS/SSL/TLS那样,我也将不胜感激一些背景信息(不必是散文;我会选择好文章的链接)。

tmbrggmn:

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

客户端的密钥库是一个PKCS#12格式文件包含

  1. 客户端的公共证书(在这种情况下,由自签名CA签署)
  2. 客户端的私有密钥

为了生成它,我使用了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上Wikipedia文章(在此处还说明了为什么需要客户端的私钥)。

所述客户机的信任是直向前JKS格式包含该文件的根中间CA证书这些CA证书将确定允许您与哪些端点进行通信,在这种情况下,它将允许您的客户端连接到提供由信任库的CA之一签名的证书的任何服务器。

要生成它,您可以使用标准的Java键盘工具,例如;

keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca

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

上面的文件仅适用于客户端。当您还想设置服务器时,服务器需要自己的密钥和信任库文件。此网站上可以找到有关为Java客户端和服务器(使用Tomcat)设置完全正常工作的示例的出色演练

问题/备注/提示

  1. 客户端证书身份验证只能由服务器强制执行。
  2. 重要提示!)当服务器请求客户端证书(作为TLS握手的一部分)时,它还将在证书请求中提供受信任CA的列表。当您希望提供用于身份验证的客户端证书由这些CA之一签名时,根本不会提供(我认为这是奇怪的行为,但是我敢肯定有原因)。这是导致我出现问题的主要原因,因为另一方未正确配置其服务器以接受我的自签名客户端证书,并且我们认为问题出在我端,原因是未在请求中正确提供客户端证书。
  3. 获取Wireshark。它具有出色的SSL / HTTPS数据包分析功能,将有助于调试和发现问题。-Djavax.net.debug=ssl如果您对Java SSL调试输出不满意,它类似于但更结构化(并且可以说)更易于解释。
  4. 完全可以使用Apache httpclient库。如果要使用httpclient,只需用等效的HTTPS替换目标URL,然后添加以下JVM参数(对于其他任何客户端,该参数都是相同的,而不管您要用于通过HTTP / HTTPS发送/接收数据的库如何) :

    -Djavax.net.debug=ssl
    -Djavax.net.ssl.keyStoreType=pkcs12
    -Djavax.net.ssl.keyStore=client.p12
    -Djavax.net.ssl.keyStorePassword=whatever
    -Djavax.net.ssl.trustStoreType=jks
    -Djavax.net.ssl.trustStore=client-truststore.jks
    -Djavax.net.ssl.trustStorePassword=whatever

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java客户端中接受服务器的自签名ssl证书

如何创建包含客户端证书链的BKS(BouncyCastle)格式的Java密钥库

通过HTTPS / SSL的Java客户端证书

Java:带有自签名证书的SSL客户端身份验证

为什么Java在SSL握手期间不发送客户端证书?

在Java中选择SSL客户端证书

在Java中使用同一主机使用多个SSL客户端证书

使用自签名证书的Java ssl / https客户端

如何在客户端Java应用程序中使用客户端证书?

Java 11给出了不支持的握手消息:HTTPS与客户端证书的连接上的server_hello_done

Java Https客户端证书的工作方式与浏览器或其他工具完全不同

Swift iOS客户端证书认证

使用自签名证书的Java Rest客户端

Java-使用客户端证书认证时Ssl流被取消

卷曲与客户端证书认证

Mongo Java客户端:如何连接启用SSL但没有证书的连接?

如何在Java中使用Webclient添加CA证书和客户端证书

如何实现Grpc用户名/密码认证。Python客户端,Java服务器

TLS相互认证:证书链为空(C客户端-> Java服务器),除非cafile指向与证书相同的文件

使用Java客户端命中Tomcat HTTPS URL

客户端证书认证

Java证书客户端SSL:无法找到请求的目标的有效证书路径

Java SSL客户端-服务器:无法找到有效的证书

如何在 JAX-WS 客户端和客户端证书认证上指定客户端证书

Java中的客户端证书身份验证

Java SSL 套接字——客户端证书证明

配置 Java syslog 客户端以信任自签名证书

如何使用带有 ssl 证书的 https 客户端调用 apis 表单 java

Java SSLServerSocket:请求客户端证书允许任何客户端证书