
Eu tenho um aplicativo cliente/servidor SSL.
Meu cliente SSL possui apenas uma autoridade de certificação raiz (vamos chamá-la de rootCA1) configurada em seu armazenamento confiável.
No entanto, meu servidor SSL produz um certificado assinado por uma CA intermediária (vamos chamá-lo de interCA1).
A CA intermediária tem seu certificado (vamos chamá-lo de deviceCert) assinado por rootCA1 (no qual o cliente confia). O servidor SSL produz os certificados de interCA1 e também de rootCA1 junto com deviceCert durante SSL hello.
Agora o openssl rejeita tal conexão no lado do cliente.
Openssl deve ser capaz de estabelecer a cadeia de confiança olhando paradeviceCert--signed by-->interCA1--signed by-->rootCA1
Uma vez que confia no rootCA1 e a cadeia de confiança pode ser vista no meu entendimento.
Então, por que isso falha? por que é necessário ter CAs intermediárias configuradas no armazenamento confiável do cliente?
Responder1
Acho que o motivo para ter todos os certificados de CA intermediários configurados é o seguinte.
Vamos, para fins de argumentação, supor que só é necessário ter apenas o certificado da CA raiz na cadeia confiável.
O cliente pode então confiar em todos os certificados assinados pela CA raiz, bem como em qualquer outra CA intermediária cujo certificado seja assinado pela CA raiz (ou assinado por qualquer outra CA intermediária que possua um certificado assinado pela CA raiz).
Agora, se a chave privada da CA intermediária for comprometida por algum motivo, isso seria um problema.
Assim, ao configurar as CAs intermediárias no armazenamento confiável, o cliente declara que confia nos certificados assinados por ele e que sua chave privada não está comprometida.
Claro que existem CRLs, mas isso é um subtópico