Wzajemne uwierzytelnianie między dwiema usługami z tym samym certyfikatem na tym samym komputerze
Mam prostą usługę rozruchu sprężynowego ( service A
), która ma ujawniony interfejs API REST. Aby dodać obsługę protokołu HTTPS, użyłem tego samego certyfikatu, który jest wystawiany dla innej usługi ( service B
) znajdującej się w tym samym polu. Oto mój plik 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
Wydaje się, że to działa, gdy połączenie service A
jest nawiązywane z klienta, który nie jest service B
. Włączyłem wzajemne uwierzytelnianie między usługami, aby certyfikat klienta był weryfikowany. Gdy żądanie jest wysyłane z adresu B
do A
, pojawia się błąd
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)
Po włączeniu debugowania ssl stwierdziłem, że ten błąd jest przyczyną tego
upcoming handshake states: server finished[20]
*** Certificate chain
<Empty>
***
https-jsse-nio-8090-exec-4, fatal error: 42: null cert chain
Sprawdziłem i ponownie sprawdziłem, czy magazyn kluczy i magazyn zaufanych certyfikatów są ustawione poprawnie, ale bez powodzenia. Czy istnieje sposób, aby to działało z serwerem i klientem z tym samym certyfikatem? Doceniam wszelkie wskazówki, jak mogę to zrobić (z tym samym certyfikatem), z jakim zmagam się z tym przez tydzień.
Odpowiedzi
Czy Twój JKS zawiera cały łańcuch? Jeśli zajrzysz do środka, czy masz cały łańcuch aż do certyfikatu głównego?
Błąd mówi ci, że nie może znaleźć łańcucha. Twój certyfikat prawdopodobnie jest z podpisem własnym? lub twój JKS nie ma pełnego łańcucha.
Zobacz podobne pytanie dotyczące Stackoverflow : CamelJettyWebSocketServer, błąd krytyczny: 42: łańcuch o wartości null cert