通道 – 证书validation

我有信心为Redis提供SSL。 我有以下configuration:

[redis] CAfile= /etc/stunnel/ca.crt accept = 636 cert = /etc/stunnel/server1.crt connect = localhost:6379 key = /etc/stunnel/server1.key verify = 2 

我用openssl生成所有的密钥和证书:

 # generate ca openssl req -new -x509 \ -keyout "/etc/stunnel/ca.crt" \ -out "/etc/stunnel/ca.key" \ -days 365 \ -passout "pass:123456" \ -subj "$subj" 

然后我通过openssl genrsa -des3生成密钥然后我通过openssl req -new -key生成csr。 然后我通过openssl x509 -req生成签名证书CAopenssl x509 -req指向ca.crtca.key然后我通过openssl rsa解密密钥

上述过程发生2次以生成服务器和客户机密钥对。 服务器进入stunnelconfiguration,客户端转到python应用程序:

 r = redis.Redis(host='localhost', ssl=True, port=636, db=0, ssl_certfile='client.crt', ssl_keyfile='client.key') 

当试图运行python脚本时,我得到:

 redis.exceptions.ConnectionError: Error 1 connecting to localhost:636. [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:590). 

在stunnel日志中:

 2017.09.16 09:11:00 LOG6[9]: Peer certificate required 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): before/accept initialization 2017.09.16 09:11:00 LOG7[9]: SNI: no virtual services defined 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 read client hello A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write server hello A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write certificate A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write key exchange A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write certificate request A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write server done A 2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 flush data 2017.09.16 09:11:00 LOG7[9]: Verification started at depth=0: C=US, O="MyO", OU=MyOU, CN=redis 2017.09.16 09:11:00 LOG4[9]: CERT: Pre-verification error: self signed certificate 2017.09.16 09:11:00 LOG4[9]: Rejected by CERT at depth=0: C=US, O="MyO", OU=MyOU, CN=redis 2017.09.16 09:11:00 LOG7[9]: SSL alert (write): fatal: unknown CA 2017.09.16 09:11:00 LOG3[9]: SSL_accept: 140360B2: error:140360B2:SSL routines:ACCEPT_SR_CERT:no certificate returned 2017.09.16 09:11:00 LOG5[9]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket 

这种行为对我来说还不清楚:

  • 在stunnel configvalidation= 2应该比较客户的CA和它信任的客户
  • stunnel将CAfile设置为CA,同时签署服务器密钥和客户端密钥
  • stunnel说这是自签名证书和CA是未知的

另外,对于服务器和客户端, openssl verify -CAfile=ca.crt <filename>都可以。

 redis.exceptions.ConnectionError: Error 1 connecting to localhost:636. [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:590). 

您的客户端无法validationCA的证书。 因此,要么将其存储在系统的证书存储区中,要么将其configuration为接受它。

在服务器上做同样的事情。