A cadeia de certificados do Apache não está sendo enviada

2

Bom dia!

Eu pesquisei o Google alto e baixo. Meu Deus, eu nunca passei da página 2 dos resultados de pesquisa antes! Mas esse aqui me choca.

Eu tenho um site que estou protegendo com um certificado assinado por um certificado intermediário, assinado por um certificado de CA autoassinado. Todo site stackexchange q / a, etc parece indicar o seguinte:

  1. Concatene seu certificado de servidor com o certificado intermediário e, em seguida, com o seu certificado de autoridade de certificação. (isto é, cat apache.pem > chain_file; cat intermediary.pem > > chain_file; cat ca.pem > > chain_file)
  2. Aponte para este novo arquivo em sua configuração do ssache do apache usando SSLCertificateFile, pois o SSLCertificateChainFile está sendo reprovado.
  3. Verifique com um navegador (ou ssllabs.com ou sslshopper.com) para ver se o certificado está sendo exportado.

No entanto, quando eu verifico com um navegador, vejo apenas o certificado do servidor e não contém os certificados intermediários ou de CA. O mesmo é confirmado com ambos ssllabs e sslshopper.

Existe uma opção que está faltando para garantir que você esteja publicando toda a cadeia e não apenas o certificado do servidor?

Obrigado

    
por scuba_mike 07.04.2016 / 15:20

2 respostas

2

Se você tiver o OpenSSL à sua disposição, verificar isso é extremamente fácil:

cat /dev/null | openssl s_client -showcerts -servername example.com -connect example.com:443

Vou explicar os componentes:

  • cat /dev/null : openssl s_client funciona muito como telnet . Ele estabelece a conexão e você pode interagir com ela. Quando openssl encontra EOF no fluxo de entrada, a conexão é fechada. cat /dev/null resulta imediatamente em EOF. Alternativamente, você pode usar Ctrl D para emitir EOF no terminal.
  • openssl s_client : “Programa cliente SSL / TLS”
  • -showcerts : mostra os blobs de certificado no formato PEM. Apenas mostra o certificado do servidor de outra forma.
  • -servername example.com : Defina o nome do servidor para SNI . Obrigatório ao fazer vhosts baseados em nome HTTPS.
  • -connect example.com:443 : Conecte-se a example.com na porta 443 , a porta HTTPS padrão.

Isso resulta em algo assim:

$ cat /dev/null | openssl s_client -showcerts -servername inbox.google.com -connect inbox.google.com:443
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = mail.google.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3767 bytes and written 469 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 1B47CE2ADB10CE410C8048C3AAEF7CEF1B2B76C6D2DF5EDE78FE015A6DA44207
    Session-ID-ctx:
    Master-Key: E9AE458F6D72D507F422DA2340C7345AC6EDB087278E62A5FDA754897EC6BDF5C336AFBF6B88554E358C675A3545B724
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 100800 (seconds)
    TLS session ticket:
    snip

    Start Time: 1460049698
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

Eu usei um domínio do Google aqui porque ele tem uma cadeia de certificados mais profunda do que example.com . O certificado aqui tem "Nomes Alternativos de Assunto" e, como tal, também é válido para inbox.google.com .

Um servidor configurado incorretamente ignoraria o certificado intermediário, chamado "Google Internet Authority G2" aqui. O certificado Equifax é redundante porque a GeoTrust é uma autoridade de certificação estabelecida e confiável no seu navegador.

    
por 07.04.2016 / 19:46
0

Obrigado a Daniel B. Os problemas foram dois:

  1. Estou executando uma versão um pouco antiga do apache. Eu perdi completamente isso.
  2. Depois de alterar a configuração de volta para usar SSLCertificateChainFile , ainda tive problemas ao usar o openssl s_client.

Acontece o número 2, eu tive que descomentar a linha.

Obrigado a todos!

    
por 07.04.2016 / 23:04