Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openssl s_客户端-证书:证明客户端证书已发送到服务器 背景_Ssl_Openssl_Ssl Certificate - Fatal编程技术网

openssl s_客户端-证书:证明客户端证书已发送到服务器 背景

openssl s_客户端-证书:证明客户端证书已发送到服务器 背景,ssl,openssl,ssl-certificate,Ssl,Openssl,Ssl Certificate,我与一家服务提供商进行了一场针锋相对的比赛,该服务提供商的API受到SSL服务器和客户端证书的保护 我已经生成了CSR,从公共CA(本例中为GoDaddy)获得了证书,并向服务提供商提供了证书和CA链 他们应该已经将CA和我的客户端证书加载到他们的网关中 我正在使用openssl s_客户端连接进行最基本的测试-肯定-键… 提供者告诉我,他们的日志表明我的请求根本不包含客户端SSL证书 奇怪的是,我的证书的正确CA颁发者确实出现在SSL握手期间提供的“可接受的客户端证书CA名称”列表中 作为参

我与一家服务提供商进行了一场针锋相对的比赛,该服务提供商的API受到SSL服务器和客户端证书的保护

  • 我已经生成了CSR,从公共CA(本例中为GoDaddy)获得了证书,并向服务提供商提供了证书和CA链
  • 他们应该已经将CA和我的客户端证书加载到他们的网关中
  • 我正在使用
    openssl s_客户端连接进行最基本的测试-肯定-键…
  • 提供者告诉我,他们的日志表明我的请求根本不包含客户端SSL证书
  • 奇怪的是,我的证书的正确CA颁发者确实出现在SSL握手期间提供的“可接受的客户端证书CA名称”列表中
  • 作为参考,我创建并提供给他们进行测试的自签名证书实际上工作正常
示例(失败)请求 我读取的
SSL3警报读取:致命:未知CA
错误是服务器无法识别我(事实上)提供的证书的颁发者。但是,提供商“保证”我CA证书已正确加载,我无法说服他们不这样做

问题: 因此,抛开其他(广泛的)故障排除步骤不谈,我真正想知道的是:

openssl s_client是否有一些输出可以最终表明客户端证书不仅是服务器请求的,而且实际上是在SSL握手过程中传输到服务器的?

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


EJP的回答表明,我提供的示例输出足以证明
编写客户端证书A
,但无论命令行上是否使用了
-cert
选项,都会显示此输出,因此,这并不表示证书已发送

为了验证客户端证书是否正在发送到服务器,您需要分析
-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
$ openssl s_client -connect host:443 \
   -cert cert_and_key.pem \
   -key cert_and_key.pem  \
   -state -debug
这对于帮助您在输出中找到自己的位置非常重要

  • 然后,
    -debug
    标志显示下一步发送的原始字节:

    write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
    0000 - 16 03 01 00 07 0b 00 00-03                        .........
    000c - <SPACES/NULS>
    
  • 换句话说:
    s_client
    完成了从服务器发送的数据读取,并将12个字节作为“无客户端证书”消息发送到服务器


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

    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
    
    $ 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
    

    1576字节
    本身就是一个很好的指示,表明证书已被传输,但除此之外,右边的一栏将显示证书中可供人阅读的部分:您应该能够识别证书中的CN和颁发者字符串。

    我知道这是一个老问题,但似乎还没有答案。 我复制了这种情况,但我正在编写服务器应用程序,因此我也能够确定服务器端发生了什么。当服务器请求证书时,客户机发送证书,并且如果它在s_客户机命令行中有对真实证书的引用。我的服务器应用程序被设置为请求客户端证书,如果没有客户端证书,则会失败。以下是我发布的命令行:

    您的主机名在这里-vv
    s_客户端-连接:443-cert client.pem-key cckey.pem-CAfile rootcert.pem-密码全部:!ADH:!低:!经验:!MD5:@STRENGTH-tls1-状态

    当我省略命令的“-cert client.pem”部分时,服务器端的握手会失败,而s_client命令会失败并报告错误。我仍然收到报告“未发送客户端证书CA名称”,但我认为上面已经回答了这个问题

    简单的回答是,服务器确定客户端是否会在正常操作条件下(s_客户端不正常)发送证书,失败是由于服务器无法识别所提供证书中的CA。虽然双向身份验证是我的项目所必需的,但我不熟悉很多情况

    你显然是在发送证书。服务器显然拒绝了它


    此处缺少的信息是创建证书的确切方式以及提供商加载证书的方式,但这些信息可能已经全部结束。

    感谢提供更多信息。我希望将来它能帮助更多的人。我的问题最终被服务器的系统管理员团队“解决”,他们坚持认为这是我们证书的错误,并迫使我们从另一个注册商处购买一个全新的证书。我相信这是有效的,因为新注册者的CA证书已经加载到他们的网关中(而不是被错误地添加以支持我们原始证书的CA),在跟踪这个问题中的相同路径之后,我发现服务器拒绝我的测试证书的原因是客户端使用的证书类型不正确。事实证明,我所拥有的一个被标记为:
    X509v3扩展密钥用法:TLS Web服务器身份验证
    。客户端证书应具有
    X509v3扩展密钥用法:TLS Web客户端身份验证
    。所以根本原因是出现了Web服务器证书而不是客户端证书
    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