警报“ SSL3_READ_BYTES:sslv3警报不良证书”是否表示SSL失败


17

运行以下命令openssl s_client -host example.xyz -port 9093

我收到以下错误:

139810559764296:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
39810559764296:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

但是最后我得到"Verify return code: 0 (ok)"消息。

我的问题是上述警报表示什么,以及SSL是否实际成功。非常感谢您的事先帮助。

SSL handshake has read 6648 bytes and written 354 bytes
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : TLSv1.2
Cipher    : AES128-SHA
Session-ID: xx
Session-ID-ctx:
Master-Key: xx
Key-Arg   : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1475096098
Timeout   : 300 (sec)
**Verify return code: 0 (ok)**

Answers:


25

“握手失败”表示握手失败,并且没有SSL / TLS连接。您应该看到openssl退出到外壳程序(或CMD等),并且不等待输入数据发送到服务器。“验证返回码0”表示在服务器的证书中未发现任何问题,或者是因为它根本没有被检查过,或者因为它已经过检查并且质量很好(就OpenSSL的检查而言,这并不涵盖所有内容);在这种情况下,通过了解协议,我们可以推断出后一种情况适用。

接收警报bad certificate(代码42)意味着服务器要求您使用证书进行身份验证,但您没有这样做,这导致了握手失败。行前几行SSL handshake has read ... and written ...,你会看到一条线Acceptable client certificate CA names通常由几个线路识别的CA,可能跟着一行开始Client Certificate Types,也许一些关于Requested Signature Algorithms具体取决于您的OpenSSL版本,协商的协议。

在“可接受”列表中找到由CA颁发的证书,或者如果该证书为空,请在服务器上或有关服务器的文件中查找其信任的CA或与服务器运营商或所有者联系并询问他们,以及相匹配的私钥,两者以PEM格式,使用-cert $file -key $file;如果两者都在一个文件中(如PEM一样),则只需使用-cert $file。如果您使用其他格式,则可以指定它,或者在此处搜索,也可以在超级用户和安全性中搜索。关于转换各种证书和私钥格式的问题已经很多。如果您的证书需要验证“链式”或“中间”证书(甚至多个),那么根据服务器的配置,通常是来自公共CA(相对于内部CA)的证书,s_client需要技巧:将链证书添加到您的系统信任库中,或创建一个本地/临时信任库,其中包含需要验证服务器的CA证书以及需要发送的链证书。

如果您没有这样的证书,则需要获得一个证书,这是另一个问题,需要更多详细信息来回答,或者您需要找到一种无需使用证书身份验证即可连接到服务器的方法。再次检查文档和/或询问操作员/所有者。

编辑:从注释中看来,您可能具有Java中的客户端密钥和证书链以及服务器锚。在检查时,我看不到一个很好的现有答案可以完全解决该问题,因此即使搜索效果可能不太好:

# Assume Java keystore is type JKS (the default but not only possibility)
# named key.jks and the privatekey entry is named mykey (ditto)
# and the verify certs are in trust.jks in entries named trust1 trust2 etc.

# convert Java key entry to PKCS12 then PKCS12 to PEM files
keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -deststoretype pkcs12 -srcalias mykey 
openssl pkcs12 -in key.p12 -nocerts -out key.pem
openssl pkcs12 -in key.p12 -nokeys -clcerts -out cert.pem
openssl pkcs12 -in key.p12 -nokeys -cacerts -out chain.pem
# extract verify certs to individual PEM files
# (or if you 'uploaded' PEM files and still have them just use those)
keytool -keystore trust.jks -export -alias trust1 -rfc -file trust1.pem
keytool -keystore trust.jks -export -alias trust2 -rfc -file trust2.pem
... more if needed ...
# combine for s_client 
cat chain.pem trust*.pem >combined.pem
openssl s_client -connect host:port -key key.pem -cert cert.pem -CAfile combined.pem

嗨,戴夫;以下是我们遵循的程序。1:上载根CA,并将中间证书添加到密钥库中。2:将签名的Comodo证书上载到密钥库中。3:将根CA和中间证书上载到信任库。4:将密钥库和trustore文件复制到集群中的每个节点(cassandra)。节点使用SSL进行通信,它们似乎可以毫无问题地交换数据。但是,当我运行上述SSL命令时,问题就出现了。
kris433 '16

@ kris433:那是什么密钥库?您描述的过程听起来很像Java的过程,如果(并且仅当)它已经生成了一个私钥,并为其获取了“签名的Comodo证书”,尽管如果您使用的是标准Java安装程序,则它具有默认值包括Comodo的信任库,因此您无需更改它。OpenSSL不使用任何Java密钥库或信任库,并且默认情况下根本不使用任何密钥库,这就是为什么您需要使用-cert [-key]指定文件的原因。如果我正确解释了您的评论,请参阅编辑。
dave_thompson_085

非常感谢Dave。这很好。你救了我的一周。如果您来费城,奶酪牛排和冰淇淋就在我身上;)。再次感谢你。
kris433

@ kris433:不客气,但是StackExchange Official Way是使用对号接受有用的回答,因此系统可以自动使用此信息向其他查询者显示结果;查看您访问本网站时应该看的“游览”,或更具体地说是serverfault.com/help/someone-answers
dave_thompson_085

0

就我而言,当私钥与证书不匹配时,我会收到此错误。我的证书过期后我已经更新了证书,需要创建一个新的私钥。但是,我忘了在我的应用程序中引用它。当我指向新的私钥时,该错误消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.