#java #web-services #ssl #ssl-certificate #authentication
#java #веб-сервисы #ssl #ssl-сертификат #аутентификация
Вопрос:
Я подключаюсь к веб-сервису SSL client auth, я настраиваю хранилище ключей с помощью:
System.getProperties().setProperty("javax.net.ssl.keyStore",
"d:/banking/BankClient/classes/xxcompany/bank/certificate/keystore.jks");
System.getProperties().setProperty("javax.net.ssl.keyStorePassword","password");
При вызове веб-сервиса:
GetAccountBalanceResponse resp = services.getAccountBalance(request);
Я получаю следующую ошибку
WARNING:Cannot connecti with url: https://[redacted] ; reason: javax.xml.soap.SOAPException: Message send failed: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Exception in thread "main" java.rmi.RemoteException: ; nested exception is:
HTTP transport error: javax.xml.soap.SOAPException: javax.xml.soap.SOAPException: Message send failed: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at xxcompany.bank.proxy.runtime.ServicesBinding_Stub.getAccountBalance(ServicesBinding_Stub.java:146)
at xxcompany.bank.proxy.ServicesPortClient.getAccountBalance(ServicesPortClient.java:48)
at xx.bank.client.main(client.java:111)
Caused by: HTTP transport error: javax.xml.soap.SOAPException: javax.xml.soap.SOAPException: Message send failed: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at oracle.j2ee.ws.client.http.HttpClientTransport.invokeImpl(HttpClientTransport.java:174)
at oracle.j2ee.ws.client.http.HttpClientTransport.invoke(HttpClientTransport.java:150)
at oracle.j2ee.ws.client.StreamingSender._sendImpl(StreamingSender.java:176)
at oracle.j2ee.ws.client.StreamingSender._send(StreamingSender.java:113)
at xxcompany.bank.proxy.runtime.ServicesBinding_Stub.getAccountBalance(ServicesBinding_Stub.java:130)
... 2 more
Хранилище ключей содержит частный сертификат для клиента, сертификат действителен и отлично работает при использовании в браузере. Как я должен это исправить?
Большое спасибо.
Ответ №1:
Эта ошибка возникает, когда центр сертификации, подписавший сертификат сервера, либо не является одним из хорошо известных центров сертификации, либо общедоступный сертификат центра сертификации отсутствует в хранилище доверия клиента. Чтобы обойти это, вам нужно будет добавить общедоступный сертификат центра сертификации в хранилище доверия клиента.
Подробные инструкции см. в разделе Не удается найти действительный путь сертификации к запрошенной цели и не более «не удается найти действительный путь сертификации к запрошенной цели».