Como fazer com que o Apache confie em um certificado de cliente usando uma autoridade de certificação desconhecida, sem validar a autoridade de certificação

1

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.

    
por Mauro Molinari 10.09.2015 / 16:50

1 resposta

0

A julgar pelo erro, o aplicativo no seu final é baseado em Java. Eu posso estar errado aqui, esse é o meu primeiro rodeio. Mas será que, do seu lado, eles precisam importar sua CA em seu armazenamento de chaves Java?

Lembro-me de configurar uma conexão confiável (segura) entre um aplicativo Java (Atlassian Crowd) e um servidor LDAP Novel. O servidor LDAP também estava usando um certificado autoassinado. Isso falharia com um erro semelhante. A resposta foi importar o certificado para o armazenamento de chaves Java.

HTH

    
por 10.09.2015 / 17:27