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.