SSL-ключи и аутентификация клиента на Java

#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:

Эта ошибка возникает, когда центр сертификации, подписавший сертификат сервера, либо не является одним из хорошо известных центров сертификации, либо общедоступный сертификат центра сертификации отсутствует в хранилище доверия клиента. Чтобы обойти это, вам нужно будет добавить общедоступный сертификат центра сертификации в хранилище доверия клиента.

Подробные инструкции см. в разделе Не удается найти действительный путь сертификации к запрошенной цели и не более «не удается найти действительный путь сертификации к запрошенной цели».