Criei o CA da seguinte forma:
- Certificado autoassinado com uma chave privada, root-ca.cer
- Outro certificado, assinado com root-ca.cer, seu nome é admin-ca.cer
- Certificado de cliente assinado com admin-ca.cer, seu nome é client.cer
openssl verify
admin-ca.cer contra root-ca.cer passa, mas client.cer contra admin-ca.cer falha no nível 1.
Acho que se eu adicionar root-ca.cer a certificados confiáveis no meu SO, isso resolveria o problema, mas se possível, eu gostaria de evitar isso. Em vez disso, posso construir um client.cer
de tal forma que inclua toda a cadeia até root-ca.cer
?
Se isso for importante, o propósito de client.cer
é ser usado como certificado de cliente ao conectar por SSL ao meu servidor. Um host virtual usa root-ca.cer
como CA, outro admin-ca.cer
- e esse não funciona.
Não. Você pode incluir root-ca.cer, mas ele não tem confiança quando é fornecido pelo peer. A ação de adicionar a CA raiz a certificados confiáveis é o que a torna confiável (uma "âncora de confiança").
Normalmente, o arquivo PEM do certificado deve incluir todos os certificados começando com a folha (usuário ou servidor) – então seu emissor anexado abaixo, então o emissor daquele, etc, em teoria terminando com a raiz. Mas, na verdade, incluir a raiz não terá efeito na maioria dos casos se essa raiz ainda não for conhecida e confiável, então o arquivo deve ter apenas "client + admin-ca".
Quanto à sua configuração de vhost, com o tratamento de um intermediário diretamente como uma âncora de confiança: o OpenSSL moderno suporta isso (com o
PARTIAL_CHAIN
sinalizador), não me lembro bem se o OpenSSL 1.x mais antigo suportava, mas lembro que "bastante recentemente" ele não era bem suportado pelo OpenSSL de forma alguma – eles levaram até a expiração da raiz com assinatura cruzada do LetsEncrypt para finalmente implementar isso. Discussão relacionada.(LE estava em uma situação semelhante com certificados de servidor, onde os servidores eram frequentemente configurados para enviar uma cadeia "servidor + LE + ISRG(DST-cross-signed)" e o OpenSSL mais antigo não conseguia ser convencido a confiar em "ISRG" como uma CA raiz.)
Parece que o Apache não define o
X509_V_FLAG_PARTIAL_CHAIN
sinalizador ao verificar certificados de cliente, o que significa que ele não habilita o suporte do OpenSSL para usar um intermediário como uma CA confiável, então você provavelmente precisará ter a mesma CA raiz configurada para todos os vhosts e usar uma abordagem diferente para autorização de administrador.Você precisa fornecer a cadeia de confiança completa ao verificar o certificado do cliente.
Então você precisa fornecer ao servidor web um arquivo com o certificado intermediário e o certificado raiz (com o certificado intermediário primeiro no arquivo)