Como depurar cadeias de certificados com o OpenSSL?

3

Eu sou completamente novo no OpenSSL e estou lendo um tutorial sobre programação OpenSSL para conectar a um servidor:

www.rtfm.com/openssl-examples/part1.pdf
www.rtfm.com/openssl-examples/part2.pdf

De alguma forma, configurar os certificados corretos é mais complicado do que o esperado ... :(

Quando eu testo a mensagem com o openssl s_client:

openssl s_client -connect 123.456.789.0:666 -CAfile test.crt -debug

Eu recebo a mensagem de erro

depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority verify error:num=20:unable to get local issuer certificate verify return:0

e depois:

error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1257:SSL alert number 42 140685406562208:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:

Aqui está a cadeia de certificados:

 Certificate chain  
 0 
   s:myself    
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA  
 1 
   s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA    
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority  
 2 
   s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority    
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

Estou tentando fazer com que o sistema reconheça esses certificados como corretos por horas, mas sem sucesso ...

O que eu tentei até agora:

  • várias variações de adicionar o certificado COMODO à lista de certificados confiáveis usando update-ca-trust.
  • adicionando os certificados à lista de certificados confiáveis em / etc / ssl / certs
  • criando arquivos pem em uma pasta e adicionando-os com -CApath.
  • O problema com o google é que a maioria dos tutoriais discute isso do ponto de vista de um administrador de servidor, mas eu não tenho acesso ao servidor.

O sistema operacional é o Fedora.

Existe uma maneira estruturada de resolver esse problema?

Editar: o certificado foi criado da seguinte forma:

 openssl req -new -x509 -sha256 -days 365 -key mykey.key -out test.crt
    
por Beginner 28.07.2014 / 18:43

2 respostas

5

Certifique-se de incluir todos os certificados intermediários e veja se eles estão atualizados. Se test.crt for de fato um arquivo contendo apenas /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root , essa é a abordagem correta. Você pode incluir a raiz também, e a maioria dos clientes aceitará essas cadeias, mas algumas irão sufocar.

Em geral, é uma prática recomendada incluir todos os certificados do seu para o último antes da raiz, no caso de um cliente não ter o último intermediário.

Também é possível que test.crt contenha outras coisas além da cadeia correta. O OpenSSL não faz validação parcial da cadeia por padrão (em versões mais antigas, não faz nada). Ao operar neste modo, não importa o que está em / etc / ssl / certs.

Como alternativa, você pode apresentar um certificado intermediário expirado. As CAs frequentemente recertificam seus intermediários com a mesma chave; se eles fizerem isso, basta baixar o certificado de CA intermediário atualizado e substituir o certificado expirado em sua cadeia.

Finalmente, com o openssl s_client, você precisa especificar o que está sendo validado. Por exemplo, use a opção -CApath /etc/ssl/certs ou -CAfile your_ca.crt . Para a primeira opção, use o armazenamento confiável do sistema e, para a segunda opção, especifique o certificado da CA raiz.

    
por 28.07.2014 / 19:05
2

Verifique os arquivos certificados entre si.

Por padrão, temos 3 arquivos (com base em uma autoridade de certificação regular ou autoassinados):

  • chave (privada)
  • certificado (público)
  • arquivo (de autoridade) de certificado (público) < - incl. todos os intermediários

Então, a chave se encaixa no certificado e o certificado cabe na CA? Anotação: Embora os nomes sejam como * .crt ou * .key, o formato é PEM

# (openssl x509 -noout -modulus \
  -in /path/to/server.crt | \
  openssl md5 ; openssl rsa  -noout -modulus \
  -in /path/to/server.key | openssl md5) | uniq

O resultado esperado é exatamente 1 linha, por exemplo

(stdin)= a634dfd21796c72dcf8c809d3bacc966

Se você ver duas linhas, a chave e o certificado NÃO correspondem.

Se estiver bem, continue com

# openssl verify -CAfile /path/to/ca.crt /path/to/server.crt

Você quer ver

server.crt: OK

Se uma das duas etapas falhar, é recomendável recriar as certs / chaves. Se ambos estão ok você sabe que você tem que procurar em outro lugar para remover seus obstáculos (permissões, alteradas CA, um lado trabalha com openssl e outro com GNUTls, ...)

    
por 30.11.2017 / 15:18