stunnel - verificação de certificado

2

Eu tenho stunnel para fornecer SSL para o Redis. Eu tenho a seguinte configuração:

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

Eu gero todas as chaves e certificados com o openssl:

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

Então estou gerando a chave via openssl genrsa -des3 Então eu estou gerando csr via openssl req -new -key . Então estou gerando um certificado assinado via openssl x509 -req com CA e CAkey apontando para ca.crt e ca.key Então eu estou descriptografando a chave via openssl rsa

O procedimento acima ocorre 2 vezes para gerar o par de chaves do servidor e do cliente. O servidor vai para stunnel config e o cliente vai para o aplicativo python:

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

Ao tentar executar o script python, recebo:

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

Nos registros do 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

Esse comportamento não está claro para mim:

  • verify = 2 em stunnel config deve comparar a CA do cliente com as que confia
  • stunnel tem o arquivo CA configurado como CA, que assinou a chave do servidor e a chave do cliente
  • stunnel diz que é um certificado autoassinado e a CA é desconhecida

Além disso, openssl verify -CAfile=ca.crt <filename> é aceitável para o servidor e para o cliente.

    
por Rahul Katrakhtalapali 16.09.2017 / 15:09

1 resposta

0

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

Seu cliente não pode validar o certificado da CA. Então, armazene-o no armazenamento de certificados do sistema ou configure seu cliente para aceitá-lo.

Faça o mesmo no servidor.

    
por 17.09.2017 / 09:54