Estou na seguinte situação. Eu preciso configurar uma integração bidirecional com um sistema externo. O administrador do sistema externo solicitou que eu enviasse dois CSRs, um para ser usado para gerar um certificado de cliente, o outro para gerar um certificado de servidor.
Eles me enviaram os certificados correspondentes. Eu configurei o canal para eles com sucesso (isto é: eu posso invocar seu serviço fornecendo meu certificado de cliente), mas não consigo configurar corretamente o canal inverso (isto é: não consigo fazer meu Apache aceitar seu cliente) certificado sem reclamar).
Juntamente com o meu certificado do servidor (vamos chamá-lo my-server.pem) eles também me enviaram seu próprio certificado de cliente (vamos chamá-lo de seu client.pem). Esse certificado (their-client.pem) é emitido por uma CA "auto-assinada", que é uma CA que não está entre as CAs conhecidas já disponíveis no meu sistema Linux. Eu não tenho este certificado e ainda não consegui obtê-lo dos administradores do sistema externo (eles estão relutantes ... vamos deixar de lado qualquer comentário sobre isso, por favor ... > - |)
É assim que eu configuro meu VirtualHost no Apache:
SSLEngine on
SSLCertificateFile /path/to/my-server.pem
SSLCertificateKeyFile /path/to/my-server-secret-key.key
SSLVerifyClient require
SSLCACertificateFile /path/to/their-client.pem
SSLVerifyDepth 0
Como não tenho o certificado de CA e como é perfeitamente correto dizer "confie apenas nesse certificado de cliente, mais ninguém!", coloquei o próprio certificado de cliente como SSLCACertificateFile
, como sugerido na resposta para:
link
No entanto, isso parece não funcionar. O erro que eles vêem ao seu lado é:
javax.net.ssl.SSLException: Received fatal alert: unknown_ca
Depois de ativar o log SSL e defini-lo para depuração, o que vejo ao meu lado é:
[ssl:debug] [pid 3396] ssl_engine_kernel.c(1381): [client <their-ip>:41474] AH02275: Certificate Verification, depth 1, CRL checking mode: none [subject: CN=Test CA,OU=Foo,O=Bar,C=it / issuer: CN=Test CA,OU=Foo,O=Bar,C=it / serial: 1BFE / notbefore: Dec 6 15:22:45 2010 GMT / notafter: Dec 6 15:21:52 2020 GMT]
[ssl:info] [pid 3396] [client <their-IP>:41474] AH02276: Certificate Verification: Error (19): self signed certificate in certificate chain [subject: CN=Test CA,OU=Foo,O=Bar,C=it / issuer: CN=Test CA,OU=Foo,O=Bar,C=it / serial: 1BFE / notbefore: Dec 6 15:22:45 2010 GMT / notafter: Dec 6 15:21:52 2020 GMT]
[ssl:info] [pid 3396] [client <their-IP>:41474] AH02008: SSL library error 1 in handshake (server my-server.com:443)
[ssl:info] [pid 3396] SSL Library Error: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
[ssl:info] [pid 3396] [client <their-IP>:41474] AH01998: Connection closed to child 54 with abortive shutdown (server my-server.com:443)
Em outras palavras, ele ainda está tentando validar a CA fictícia do certificado de cliente. Eu também tentei alterar SSLVerifyDepth
para 1, sem sorte (mesmo erro).
Se eu desabilitar a solicitação de certificado de cliente (alterando SSLVerifyClient
), a chamada vai bem, mas não acho que seja o caminho correto a seguir.
Qualquer sugestão sobre este tópico seria muito útil.