我试图在stunnel后面获得一个rethinkdb集群。 该服务需要支持多个证书颁发机构(CA)。 目前,我将接受的CA连接成一个文件(/certs/ca.pem),但是stunnel似乎只接受匹配文件中第一个证书的连接。
我的stunnelconfiguration:
foreground = yes sslVersion = TLSv1.2 options = NO_SSLv2 options = NO_SSLv3 [driver] client = no accept = 28415 connect = 127.0.0.1:28015 cert = /certs/server.pem key = /certs/server-key.pem CAfile = /certs/ca.pem verify = 2
Stunnel版本5.06
Stunnel的日志:
2016.02.18 22:18:51 LOG5[18]: Service [driver] accepted connection from 209.136.228.130:58728 2016.02.18 22:18:51 LOG4[18]: CERT: Verification error: self signed certificate 2016.02.18 22:18:51 LOG4[18]: Rejected by CERT at depth=0: C=US, OU=Edit LLC, L=Fresno, O=Edit LLC, ST=CA, CN=jason-Lemur-Ultra 2016.02.18 22:18:51 LOG3[18]: SSL_accept: 140890B2: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned 2016.02.18 22:18:51 LOG5[18]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket
而在客户端,我得到以下错误:
SSL handshake failed: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:590)
我不确定为什么stunnel说没有证书返回。
编辑:错误来自openssl。 这里是我可以重现的:
$ cat ca.cert.pem incomming-ca.pem > bigca.pem $ openssl verify -CAfile bigca.pem incomming-ca.pem incomming-ca.pem: C = US, OU = Edit LLC, L = Fresno, O = Edit LLC, ST = CA, CN = jason-Lemur-Ultra error 18 at 0 depth lookup:self signed certificate OK $ openssl verify -CAfile bigca.pem ca.cert.pem ca.cert.pem: OK $ cat incomming-ca.pem ca.cert.pem > bigca.pem $ openssl verify -CAfile bigca.pem incomming-ca.pem incomming-ca.pem: OK
编辑(2):在这里,我尝试validation签名的证书,而不是发送根CA
$ openssl genrsa -des3 -out server.key 1024 $ openssl req -new -key server.key -out server.csr $ openssl x509 -req -days 360 -in server.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out server.crt $ cat ca.cert.pem incomming-ca.pem > bigca.pem $ openssl verify -CAfile bigca.pem server.crt server.crt: OK
酷,但让我们切换bigca.pem的顺序
$ cat incomming-ca.pem ca.cert.pem > bigca.pem $ openssl verify -CAfile bigca.pem server.crt server.crt: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd error 7 at 0 depth lookup:certificate signature failure 140351186847392:error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01:rsa_pk1.c:100: 140351186847392:error:04067072:rsa routines:RSA_EAY_PUBLIC_DECRYPT:padding check failed:rsa_eay.c:721: 140351186847392:error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP lib:a_verify.c:233:
通过configurationstunnel来要求客户端证书,使用:
verify = 2
你告诉stunnel拒绝/拒绝没有提供有效客户证书的客户。 而这条日志消息表明客户端没有提供客户端证书,因此被拒绝:
SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
这我们知道。 现在, 为什么会发生这种情况。 客户端消息是我们的提示:
[SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca
TLS服务器通过发送可信CA列表来请求客户端发送其客户端证书; 这些是您的/certs/ca.pem文件中的CA证书。 然后,客户端查找来自其中一个CA的证书 ; 如果客户根本没有证书, 或者没有来自其中一个CA的证书,则客户将根本不提供证书。
事实上,你的客户说它不能识别服务器发送的任何CA,说你的客户或者a)没有客户证书,或者b)客户证书来自不在/certs/ca.pem文件。
我不确定你正在使用哪个TLS客户端,所以我不能帮上忙,但是上面的build议是检查客户端的客户端证书/密钥的configuration,并检查客户端configuration的证书是否来自您的/certs/ca.pem文件中的一个CA。
希望这可以帮助!