Myśląc, że trafiłem na ten sam problem, co inni ludzie, przechodziłem przez wiele podobnych problemów i potencjalnych rozwiązań, ale bez powodzenia.Java SSL - InstallCert rozpoznaje certyfikat, ale nadal "nie można znaleźć prawidłowej ścieżki certyfikacji" błąd?
Magazyn zaufanych certyfikatów, którego używam, to cacerts, znajdujący się w bibliotece lib/security środowiska Java 1.6.0 JRE (kompilacja 1.6.0_20-b02 ... czy może to być przyczyną problemu?). Próbowałem również z jssecacerts.
Korzystanie z InstallCert (na inne podobne problemy opublikowane), widzę, że mój certyfikat jest rzeczywiście zainstalowany i ważny (i usunąłem go, ponownie zaimportowałem, itp., Aby upewnić się, że widzę odpowiednie dane) :
java InstallCert <my host name>
Loading KeyStore jssecacerts...
Opening connection to <my host name>:443...
Starting SSL handshake...
No errors, certificate is already trusted
Sprawdzanie w keytool i Portecle, ponowne importowanie cert (próbowałem generowania z OpenSSL z -showcert, eksport z przeglądarek i scp'ing go, itp) daje mi „, która istnieje już pod ten inny alias tutaj "typ wiadomości. Tak więc nie wydaje się, aby istniał jakiś problem związany ze sposobem, w jaki cert dostaje się do narzędzia (narzędzi).
Wymuszanie jawnych ścieżek zaufania w kodzie nie ma żadnego znaczenia, a we wszystkich przypadkach to, co widzę po włączeniu debugowania (za pomocą zestawu właściwości Jawax.net.debug do "wszystkich") to:
main, SEND TLSv1 ALERT: fatal, description = certificate_unknown
main, WRITE: TLSv1 Alert, length = 2 [Raw write]: length = 7 0000: 15
03 01 00 02 02 2E ....... main, called
closeSocket() main, handling exception:
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to
find valid certification path to requested target
Niestety nie mogę pozwolić na przesłonięcie czeku przez wdrożenie własnego TrustManagera - musi to sprawdzić.
Certyfikat, który otrzymuję od hosta, ma kilka rozszerzeń (dokładnie po 9), co sprawia, że zastanawiam się, czy są one częścią tego problemu.
Co jeszcze mogę sprawdzić/spróbować? Przejdź na inną wersję JRE?
Dlaczego nie możesz zaimplementować własnego 'TrustManager'? Nadal możesz korzystać z certyfikatów w menedżerze powierniczym i wykonać czek. –
@Vivin - Podstawowym problemem, który próbuję rozwiązać, jest warstwa aplikacji, której nie kontroluję bezpośrednio (w tym przypadku aplikacja Grails wywołująca niektóre usługi internetowe, które ostatnio stały się tylko HTTPS), więc gdybym mogła z niego korzystać w moim własnym lokalnym scenariuszu nie mogę wymusić jego wykorzystania na początku. To jest ból, ale poradzę sobie z nim później - na razie, jeśli mogę sprawić, że będzie działał na najbardziej szczegółowym poziomie, przynajmniej powie mi, gdzie pójść dalej w łańcuchu rozdzielczości. – Bill
Czy używasz tego na serwerze aplikacji, takim jak GlassFish? Możesz sprawdzić, czy proces uruchamia plik binarny Java w pliku /usr/lib/jvm/java-1.6.0-sun-1.6.0.20.x86_64, a nie inne pliki binarne Java, które nie odpowiadają Twojemu zaufanemu magazynowi (OpenJDK, itp). Opublikowane wyniki debugowania są pomocne, możesz dodać więcej? – Brad