erro de verificação do certificado SSL do cliente: (27: certificado não confiável)

2

Estou tendo alguma dificuldade com a autenticação de cliente do nginx ao usar uma CA intermediária (criada automaticamente).

Embora o mesmo conjunto de certificados (certificados intermediários + raiz em um único arquivo .pem) funcione muito bem para autenticação de clientes em IMAP (dovecot) e SMTP (postfix), não consigo fazer isso funcionar com o nginx . Em vez disso, estou recebendo o seguinte erro:

[info] 23383#23383: *14583139 client SSL certificate verify error: (27:certificate not trusted) while reading client request headers, client: 82.39.81.156, server: <hostname>, request: "GET /mailboxes HTTP/1.1", host: "<hostname>"

Pelo que entendi, um tipo de erro 27 de openssl é X509_V_ERR_CERT_UNTRUSTED , ou algum tipo de problema com um certificado não sendo confiável para uma finalidade específica, no entanto, não consigo mais elaborar.

Todos os certificados individuais e empacotados parecem validar corretamente com openssl verify (posso verificar os certificados do cliente em relação ao intermediário ou ao pacote, e o certificado intermediário valida contra o certificado raiz, ou seja, é válido em todas as combinações que posso pensar de).

Minhas autoridades de certificação raiz e intermediárias devem ser configuradas com as extensões corretas para verificar meus certificados de cliente. Veja a amostra relevante do meu arquivo openssl.conf personalizado:

[ v3_ca ]
# Extensions for a typical CA ('man x509v3_config').
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer
basicConstraints        = critical, CA:true
keyUsage                = critical, digitalSignature, cRLSign, keyCertSign

[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA ('man x509v3_config').
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer
basicConstraints        = critical, CA:true, pathlen:0
keyUsage                = critical, digitalSignature, cRLSign, keyCertSign

Enquanto isso, os certificados de clientes que estou emitindo são configurados para funcionar tanto para autenticação de cliente quanto para criptografia / assinatura de email, como:

[ user_cert ]
# Extensions for client certificates ('man x509v3_config').
basicConstraints        = CA:FALSE
nsCertType              = client, email
nsComment               = "OpenSSL Generated Client Certificate"
subjectAltName          = email:move
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid,issuer
keyUsage                = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage        = critical, clientAuth, emailProtection

(na verdade, se eles não estivessem definidos corretamente, o Safari e o Mail do OS X não me deixariam enviá-los, já que tendem a ser realmente rigorosos).

Uma série de perguntas semelhantes recomendou a definição de ssl_verify_depth para um valor de 2 (para verificar os certificados intermediário e raiz), mas isso não parece ajudar.

    
por Haravikk 22.02.2016 / 16:49

1 resposta

4

Eu tenho a mesma configuração e tenho tentado diagnosticar esse problema exato. Os certs funcionaram bem em uma instância do apache, mas o nginx estava sendo um problema. Esta é a solução que eu criei.

Aponte seu ssl_client_certificate para seu certificado raiz. Não é seu intermediário. Em seguida, garanta também que o nginx verifique até uma profundidade de 2. Eu tentei ter um arquivo de cadeia de certificados como o parâmetro para o certificado de cliente e ele ainda não funcionou. Não entendo por que tem como raiz, em vez do intermediário que assinou o certificado. Mas isso funciona.

Para completar, aqui estão as partes relevantes da configuração do meu nginx:

server {
    listen 8443 ssl;
    server_name               www.example.com;

    ssl                       on;
    ssl_certificate           /path/to/cert.pem;
    ssl_certificate_key       /path/to/key.key;
    ssl_client_certificate    /path/to/root.ca.cert;
    ssl_verify_client         on;
    ssl_verify_depth          2;
    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers               <snipped-for-length>;
}
    
por 15.03.2016 / 00:26