当连接到需要客户端证书和可选客户端证书的服务器时,openssl s_client 的行为是否不同?

当连接到需要客户端证书和可选客户端证书的服务器时,openssl s_client 的行为是否不同?

我正在与支持但不要求客户端证书身份验证的服务器建立 SSL 连接。在浏览器中,我可以使用令牌进行身份验证,也可以取消提供证书的提示,然后访问站点的登录页面以提供用户名/密码。

我想使用 测试此连接openssl s_client -connect my.server.name。服务器证书verify看起来不错,但后面跟着

...:SSL3_READ_BYTES:sslv3 警报错误证书:s3_pkt.c:1275:SSL 警报编号 42

...:SSL 例程:SSL23_WRITE:ssl 握手失败:s23_lib.c:184

据我所知,“警报错误证书”意味着客户端证书“错误”(这是有道理的,因为没有证书)。之后,它会显示编码的服务器证书,然后显示“可接受的客户端证书 CA 名称”(带有 CA 列表)以及一些基本状态内容。

我没有看到任何信息告诉我这些错误(证书错误/握手失败)是否是致命的,即是否需要客户端证书,如果没有证书连接就无法继续。在调试/详细模式下,这些信息会更清楚吗?我是否需要传递一个单独的标志来表示“我知道握手会说客户端证书是可选的,所以不要提供”?

ETA:下面有更完整的输出

> openssl s_client -connect targetserver:8443

CONNECTED(00000003)
depth=1 CN = My Private CA
verify return:1
depth=0 CN = targetserver
verify return:1
140155024262984:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1275:SSL alert number 42
140155024262984:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
Certificate chain
 0 s:/CN=targetserver
   i:/CN=My Private CA
---
Server certificate
-----BEGIN CERTIFICATE-----
{{encoded cert}}
-----END CERTIFICATE-----
subject=/CN=targetserver
issuer=/CN=My Private CA
---
Acceptable client certificate CA names
{{A bunch of CA names}}
Server Temp Key: ECDH, secp521r1, 521 bits
---
SSL handshake has read 7947 bytes and written 230 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: {{bytes}}
    Session-ID-ctx:
    Master-Key: {{bytes}}
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1612284655
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

答案1

我没有看到任何信息告诉我这些错误(坏证书/握手失败)是否致命,即,是否需要客户端证书,并且如果没有它连接就无法继续。

SSL 警报是否致命取决于警戒级别与警报一起发送。遗憾的s_client是不显示这些信息。

在调试/详细模式下这些信息会更清楚吗?

调试模式将以十六进制显示消息的全部内容,需要以某种方式对其进行解码。没有简单的方法可以使用 来访问此信息s_client

我是否需要传递一个单独的标志来表示“我知道握手会说客户端证书是可选的,不要出示”?

客户端证书的工作方式并非如此。无论客户端证书是可选的还是强制的,服务器都会发送CertificateRequest。客户端无法确定客户端证书是否是强制的。但如果客户端没有证书,它只会发送无证书,即提供的证书数量为 0。然后服务器决定是否不接受证书,即可选证书与强制证书只是服务器端的事情。

相关内容