【发布时间】:2013-06-16 17:09:34
【问题描述】:
背景
我陷入了与服务提供商的相互指责中,该服务提供商的 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:
我对@987654323@ 错误的解读是服务器无法识别我(实际上)提供的证书的颁发者。但是,提供商“向我保证”CA 证书已正确加载,否则我无法说服他们。
问题
所以,抛开其他(广泛的)故障排除步骤,我真正想知道的是:
openssl s_client 是否有一些可用输出最终表明客户端证书不仅是服务器请求的,而且实际上是在 SSL 握手期间传输到服务器的?
我尝试过-state、-msg、-debug 和-trace 选项,但没有解释输出所需的背景知识。
EJP 的回答表明,我提供的示例输出足以证明 write client certificate A,但无论是否在命令行上使用了 -cert 选项,此输出都会出现,因此它并不表示证书是已发送。
【问题讨论】:
标签: ssl openssl ssl-certificate