REST i SSL - problem z certyfikatem

0

Mam klasę API która wystawia metody do robienia requestów (nie pisana przeze mnie - dostałem ją od klienta). Dostałem też certyfikat (.crt) klucz prywatny i hasło.
Jak dodaje to sobie do ustawień Postmana to bez problemu mogę robić zapytania do tego API.
Potrzebuję natomiast robić requesty z kodu Javy. Nie wiem czy dobrze zrobiłem ale za pomocą openssl zrobiłem sobie plik z rozszerzeniem *.p12 a następnie wczytałem to do KeyManager'a:

        File clientCertificatePath = new File("PathToCertificate.p12");
        String clientPassword = "***********";

        KeyStore clientStore = KeyStore.getInstance("PKCS12");
        clientStore.load(new FileInputStream(clientCertificatePath), clientPassword.toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(clientStore, clientPassword.toCharArray());
        KeyManager[] kms = kmf.getKeyManagers();

        ApiClient client = new ApiClient();
        client.setKeyManagers(kms); 

Jak widać w ostatniej linijce wrzucam tego keyManagera do API klienta.
Niestety jak robię request to i tak mi się to sypie:

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
	at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:290)
	at java.base/sun.security.validator.Validator.validate(Validator.java:264)

Zaimportowałem także certyfikat *.crt do pliku cacerts w jre javy.
Jak się przez to debuguje to widzę że mój KeyManager ma wczytany ten certyfikat i klucz prywatny a gdzieś niżej już w kodzie Javy jest robiona jakaś walidacja która się wywala.
Jakieś pomysły?

0

Oczywiście patrzyłeś na https://stackoverflow.com/questions/21076179/pkix-path-building-failed-and-unable-to-find-valid-certification-path-to-requ ?
Jakiś czas temu też się z tym męczyłem, pamiętam tylko że różniły się pliki .cer i .crt

0

Zdaje się, że ten plik trzeba jeszcze wskazać na poziomie JVM albo na poziomie argumentów serwera aplikacji przekazywanych do JVM. Tutaj masz link jak ktoś coś podobnego robi: https://stackoverflow.com/a/40370627

1

O ile dobrze zrozumiałem, to jesteś stroną kliencką i łączysz się do jakiegoś zewnętrznego REST API. Jeżeli to zewnętrzne REST API posiada certyfikat podpisany przez CA, które jest *zaufane to nie musisz niczego konfigurować. Jeżeli posiadają certyfikat podpisany przez CA, które nie jest domyślnie *zaufane to musisz dodać to CA (lub też sam certyfikat) do cacerts. Jeżeli certyfikat jest self signed to dodajesz go do cacerts.
To wszystko w przypadku gdy macie tzw "one way ssl", w przypadku "two way ssl" (czy też "mutual ssl") sytuacja jest troszkę bardziej skomplikowana (ale niewiele).

A poza tym wątpię, że dostałeś klucz prywatny (chyba, że ktoś jest nieogarem)

*zaufane oznacza, że to CA znajduje się w pliku cacerts javy, na której uruchomiona jest twoja aplikacja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1