У меня есть stunnel для предоставления SSL для Redis. У меня такая конфигурация:
[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
Затем я генерирую csr через openssl req -new -key
. Затем я создаю подписанный сертификат через openssl x509 -req
с участием CA
и CAkey
указывает на ca.crt
и ca.key
Затем я расшифровываю ключ через openssl rsa
Вышеупомянутая процедура повторяется 2 раза для генерации пары ключей сервера и клиента. Сервер переходит в конфигурацию stunnel, а клиент переходит в приложение 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
Мне непонятно такое поведение:
Также, 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).
Ваш клиент не может проверить сертификат ЦС. Так что либо сохраните его в хранилище сертификатов системы, либо настройте клиента на его прием.
Сделайте то же самое на сервере.