我正在尝试保护 stunnel 后面的 rethinkdb 集群。该服务需要支持多个证书颁发机构 (CA)。目前,我将接受的 CA 合并到一个文件 (/certs/ca.pem) 中,但似乎 stunnel 只会接受与文件中第一个证书匹配的连接。
我的隧道配置:
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):在这里我尝试验证签名的证书,而不是发送根 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:
答案1
stunnel
通过配置要求客户端证书,使用:
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
CA。
我不确定您正在使用哪个 TLS 客户端,所以我无法提供帮助,但以上建议您检查该客户端的客户端证书/密钥的配置,并检查配置为客户端使用的证书是否来自您/certs/ca.pem
文件中的其中一个 CA。
希望这可以帮助!