当前位置: 首页 > 知识库问答 >
问题:

openssl s_client-cert:证明客户端证书已发送到服务器

苏洛城
2023-03-14

我陷入了与一个带有SSL服务器和客户端证书保护的API的服务提供商的指指点点的匹配中。

  • 我生成了一个CSR,从一个公共CA(本例中为GoDaddy)获得了一个证书,并将证书和CA链提供给服务提供商。
  • 他们应该已将CA和我的客户端证书加载到他们的网关中。
  • 我正在使用OpenSSL s_client-connect...-cert...-key...
  • 进行最基本的测试
  • 提供商告诉我,他们的日志建议我的请求根本不包括客户端SSL证书。
  • 奇怪的是,在SSL握手期间提供的“可接受的客户端证书CA名称”列表中确实出现了我的证书的适当CA颁发者。
  • 作为参考,我创建并提供给他们测试的自签名证书实际上可以正常工作。
[shell ~]$ openssl s_client -connect host:443 -cert cert_and_key.pem -key cert_and_key.pem -state -quiet
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
depth=2 **SNIP**
verify return:1
depth=1 **SNIP**
verify return:1
depth=0 **SNIP**
verify return:1
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write certificate verify A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL3 alert read:fatal:unknown CA
SSL_connect:failed in SSLv3 read finished A
140011313276744:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1197:SSL alert number 48
140011313276744:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

我读到的SSL3 alert read:fataly:unknown CA错误是服务器无法识别我(实际上)提供的证书的颁发者。但是,提供者向我“保证”CA证书已正确加载,而我却无法说服他们。

openssls_client中是否有一些输出可以确凿地显示客户端证书不仅仅是由服务器请求的,而是在SSL握手过程中传输到服务器的?

我试用了-state-msg-debug-trace选项,但没有解释输出所需的背景。

EJP的回答表明,我提供的示例输出已经足够证明客户端证书a了,但是无论命令行中是否使用了-cert选项,都将出现此输出,因此它并不表示发送了证书。

共有1个答案

邬博涉
2023-03-14

为了验证客户端证书正在发送到服务器,您需要分析-state-debug标志组合的输出。

首先作为基线,尝试运行

$ openssl s_client -connect host:443 -state -debug

您将得到大量的输出,但我们感兴趣的行看起来是这样的:

SSL_connect:SSLv3 read server done A
write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
0000 - 16 03 01 00 07 0b 00 00-03                        .........
000c - <SPACES/NULS>
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 read server done A  
write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
0000 - 16 03 01 00 07 0b 00 00-03                        .........
000c - <SPACES/NULS>

最后,-state标志再次报告-debug刚才回显的步骤的结果:

SSL_connect:SSLv3 write client certificate A

换句话说:s_client完成了从服务器发送的数据读取,并将12个字节作为(我假定的)“无客户端证书”消息发送到服务器。

如果重复测试,但这次包含-cert-key标志,如下所示:

$ openssl s_client -connect host:443 \
   -cert cert_and_key.pem \
   -key cert_and_key.pem  \
   -state -debug
SSL_connect:SSLv3 read server done A
write to 0x7bd970 [0x86d890] (1576 bytes => 1576 (0x628))
0000 - 16 03 01 06 23 0b 00 06-1f 00 06 1c 00 06 19 31   ....#..........1
(*SNIP*)
0620 - 95 ca 5e f4 2f 6c 43 11-                          ..^%/lC.
SSL_connect:SSLv3 write client certificate A
 类似资料:
  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 我已经编写了小型Java 7客户端和服务器应用程序。我有3个自签名的X.509 RSA证书的密钥库。当客户端通过SSL连接时,服务器只发送一个证书的SSL证书消息。我对SSL/TLS有点陌生。我还研究了JSSE代码sun。安全ssl。X509KeyManagerImpl,并找到以下注释: 评论很清楚,服务器将发送单个最佳匹配证书,但我似乎不理解原因。就像在我的例子中一样,我希望服务器发送所有3个证

  • 我在服务器中部署了基于soap的cxf服务服务器,在不同的服务器中部署了基于soap的cxf服务客户端。这两个服务器都具有有效的SSL证书。在不同的场景中,两者都充当客户机和服务器。现在我通过服务器调用客户端服务,tomcat并没有向客户端发送服务器证书。那么tomcat是否有任何配置或jvm来向客户端发送ssl证书呢。请帮帮我。 我添加了JAVA_选项的更多细节 -贾瓦克斯。网调试=ssl -贾

  • 编辑我可以将我的OkHttp客户端构建到它在客户端中同时包含客户端证书的位置。SSLContext。KeyManager和客户端中的受信任证书。SSLContext。信任管理器 但是,我的客户端仍然没有发送我的客户端证书(通过信任存储成功验证了服务器证书)。在ssl调试日志中获取它 <代码>密钥库。jks是用以下命令构建的 我还尝试使用客户端证书使用根证书和中间证书创建存储: 另一个可能的问题是C

  • 附加内容 How I’ve set up SSH keys on my Yubikey 4 (so far) How to Harden SSH with Identities and Certificates Scalable and secure access with SSH

  • 我收到了一个新的密钥库。jks文件用于ssl连接,以替换旧的但仍在工作的。jks密钥库文件,但我收到了“意外握手消息:serve_hello”错误。我被告知要确保密钥库包含客户端证书,所以我使用keytool将其证书导出到pem文件,然后使用openssl检查目的。结果显示 证书用途:SSL客户端:否SSL客户端CA:否SSL服务器:是SSL服务器CA:否... 然而,当我应用相同的过程来检查旧的