Autenticação mútua entre dois serviços com o mesmo certificado na mesma máquina

Nov 26 2020

Eu tenho um serviço de boot de primavera simples ( service A) que tem algumas APIs REST expostas. Para adicionar suporte a https, usei o mesmo certificado emitido para outro serviço ( service B) presente na mesma caixa. Aqui está meu arquivo application.properties

server.ssl.enabled=true
server.ssl.client-auth=need
server.ssl.key-store=keystore.jks
server.ssl.key-store-password=password
server.ssl.key-store-type=JKS
server.ssl.trust-store-password=password
server.ssl.trust-store=keystore.jks
server.ssl.trust-store-type=JKS

Isso parece estar funcionando quando a conexão com service Aé feita de um cliente que não é service B. Habilitei a autenticação mútua entre serviços para que o certificado do cliente seja validado. Quando uma solicitação está sendo feita de Bpara A, estou recebendo um erro

javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
        at sun.security.ssl.Alert.createSSLException(Alert.java:131)
        at sun.security.ssl.Alert.createSSLException(Alert.java:117)

Depois de habilitar a depuração SSL, descobri que este erro está causando isso

upcoming handshake states: server finished[20]
*** Certificate chain
<Empty>
***
https-jsse-nio-8090-exec-4, fatal error: 42: null cert chain

Eu verifiquei e verifiquei novamente se o keystore e o truststore estão definidos corretamente, mas sem sorte. Existe uma maneira de fazer isso funcionar com o servidor e o cliente com o mesmo certificado? Agradeço todas as dicas sobre como posso fazer isso funcionar (com o mesmo certificado), pois tenho lutado com isso por uma semana.

Respostas

1 SusanMustafa Nov 26 2020 at 03:36

O seu JKS contém toda a cadeia? Se você olhar dentro, você tem toda a cadeia até o certificado raiz?

O erro indica que não foi possível encontrar a corrente. Seu certificado provavelmente é autoassinado? ou seu JKS não tem a cadeia completa.

Veja a pergunta Stackoverflow semelhante: CamelJettyWebSocketServer, erro fatal: 42: cadeia de certificados nula