当前位置: 首页 > 面试题库 >

Java HTTPS客户端证书认证

拓拔弘扬
2023-03-14
问题内容

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

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

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

正如我之前刚说过的那样,HTTPS/SSL/TLS所以我也希望了解一些背景信息(不必是散文;我会选择好文章的链接)。


问题答案:

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

该客户端的密钥库是一个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上的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


 类似资料:
  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 本文向大家介绍什么是客户端证书?相关面试题,主要包含被问及什么是客户端证书?时的应答技巧和注意事项,需要的朋友参考一下 客户端系统向远程服务器发出经过身份验证的请求所用的数字证书被称为客户端证书。客户端证书在许多相互认证设计中起着非常重要的作用,为请求者的身份提供了强有力的保证。

  • 我尝试将文件添加到configuration中,以访问站点。我在<code>系统中添加了以下行。属性文件: 之后,我重新启动了,但得到了相同的错误,。我使用keytool将文件转换为,并通过替换以前的行将以下行添加到同一文件中。 在这种情况下,错误消息也是相同的: 响应代码: 非 HTTP 响应代码: handshake_failure 我使用HTTP Client 4作为HTTP Sampler

  • type String - clientCertificate. origin String - 必须从缓存中删除相关客户端证书的服务器的来源。

  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 问题 你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像SSL那样的复杂。 解决方案 可以利用 hmac 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例: import hmac import os def client_authenticate(connection, secret_key): ''' Authenticate client t