我正在与支持但不要求客户端证书身份验证的服务器建立 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。然后服务器决定是否不接受证书,即可选证书与强制证书只是服务器端的事情。