背景
我陷入了与服务提供商的指责匹配,该服务提供商的 API 受 SSL 服务器和客户端证书保护。
- 我已经生成了一个 CSR,从公共 CA(在本例中为 GoDaddy)获得了证书,并将证书和 CA 链提供给了服务提供商。
- 据说他们已将 CA 和我的客户端证书加载到他们的网关中。
- 我正在使用最基本的级别测试
openssl s_client -connect ... -cert ... -key ...
- 提供商告诉我,他们的日志表明我的请求根本不包括客户端 SSL 证书。
- 奇怪的是,我的证书的正确 CA 颁发者确实出现在 SSL 握手期间提供的“可接受的客户端证书 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:fatal:unknown CA
是服务器无法识别我(实际上)提供的证书的颁发者。但是,提供商向我“保证”CA 证书已正确加载,否则我无法说服他们。
问题
因此,抛开其他(广泛的)故障排除步骤,我真正想知道的是:
是否有一些可用的输出openssl s_client
最终表明客户端证书不仅是服务器请求的,而且实际上是在 SSL 握手期间传输到服务器的?
我已经尝试了-state
、-msg
和选项-debug
,-trace
但没有解释输出所需的背景知识。
EJP 的回答表明,我提供的示例输出足以证明 . write client certificate A
,但无论-cert
选项是否在命令行上使用,此输出都会出现,因此并不表示已发送证书。