A autenticação do certificado de cliente NginX falha com “impossível obter certificado de emissor”

1

Atualmente, estou lutando contra um problema persistente ao configurar a autenticação de certificado de cliente para nossos servidores de e-mail por meio de um proxy reverso NginX.

A configuração parece estar funcionando na maioria das partes sem os certificados do cliente. Mas quando eu habilito a checagem destes e executo um teste com openssl s_client eu sempre obtenho:

Verify return code: 2 (unable to get issuer certificate)

A parte relevante do meu nginx.conf é a seguinte:

ssl                     on;
ssl_certificate         /etc/ssl/certs/server_cert.pem;
ssl_certificate_key     /etc/ssl/private/server_key.pem;

ssl_client_certificate  /etc/ssl/certs/IntermediateCA_chain.crt;
ssl_crl                 /etc/ssl/crl.pem;
ssl_verify_client       on;

O arquivo IntermediateCA_chain.crt está no formato PEM e consiste no certificado do IntermediateCA e depois no certificado do RootCA.

Side-note: when I do openssl x509 -text -noout -in IntermediateCA_chain.crt only the IntermediateCA's cert is shown. I expected the chain to be displayed. Is that the correct behaviour?

Eu testo a conexão com o seguinte comando:

openssl s_client -connect server:995 -cert mycert.pem\
 -key mykeyfile.pem -debug -CAfile IntermediateCA_chain.pem

Como resultado

[...]
0b50 - b3 c3 3b 17 66 8e 52 b3-ad 7f 14                  ..;.f.R....
depth=1 DC = top, DC = ad, CN = Intermediate CA
verify error:num=2:unable to get issuer certificate
issuer= C = DE, O = My Company, CN = My Companies Root CA, emailAddress = [email protected]
read from 0x10f6a10 [0x10fe333] (5 bytes => 5 (0x5))
[...]

Eu tentei todas as variações de IntermediateCA_chain.pem eu poderia pensar em (IntermediateCA.pem, RootCA.pem, IntermediateCA_chein.pem) em ambos os lados.

Parece que a falha está no lado do cliente, porque ela muda levemente com o -CAfile usado e os logs do servidor não mostram nada (literalmente nada - nenhuma tentativa de conexão ou qualquer outra coisa). Parece-me que o IntermediateCA_chain.pem no servidor ou o lado do cliente não são lidos corretamente. O erro parece resultar no fato de o openssl não conseguir verificar o IntermediateCA e os certificados emitidos por ele. Alguém pode me ajudar a resolver este enigma?

    
por Marlon 12.01.2017 / 15:41

1 resposta

1

Problema resolvido.

Vou postar as razões e a solução para a pequena possibilidade de que possa ajudar alguém:

O primeiro erro ( verify error:num=2:unable to get issuer certificate ) resultou da forma do -CAfile usado no lado do cliente. Ele estava no formato x509 PEM e continha uma cadeia do certificado do IntermediateCA pelo cert do RootCA. O problema era que também continha CRL (Certificate Revocation List) de cada CA, após o respectivo bloco de certificados. A remoção deles resolveu esse erro.

Depois eu só recebi um "SSL-error" não-descritivo que eu diagnostiquei ao transformar opções individuais no nginx.conf (obrigado @mofoe pela dica!). Acontece que o ssl_crl dentro do nginx.conf precisa conter não apenas a CRL do IntermediateCA (no formato x509 PEM!), Mas também a CRL do Root-CA. A combinação desses dois em um arquivo CRL solucionou o segundo erro e o servidor respondeu com a mensagem de boas-vindas esperada do servidor de email.

    
por 13.01.2017 / 15:44