Почему я неожиданно получаю сообщение об ошибке «Ошибка построения пути PKIX» при обработке платежа Paypal

1

Веб-сайт, основанный на Java, обрабатывает платежи с использованием Paypal. Ошибка началась вчера вечером около 11 вечера по Гринвичу, не было никаких изменений кода, которые я не могу решить, если проблема связана с моим хостинг-провайдером или с Paypla.

Код, бросающий исключение,

                // Send back to PayPal system to validate using POST
                URL u = new URL(URL_PAYPAL_VALIDATE);
                HttpURLConnection uc = (HttpURLConnection) u.openConnection();
                uc.setDoOutput(true);
                uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                PrintWriter pw = new PrintWriter(uc.getOutputStream());
                pw.println(str);
                pw.close();

и происходит на uc.getOuputStream()

Это исключение

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
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.jthink.store.action.VerifyPayment.handleRequest(VerifyPayment.java:160)
        at com.jthink.store.JThinkStoreServlet.doGet(JThinkStoreServlet.java:45)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
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 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 31 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 37 more 
  • 0
    Недавно PayPal разослал уведомление о том, что они обновляют свои сертификаты.
  • 0
    У @EJP есть больше информации, я нашел этот odoo.com/fr_FR/forum/help-1/question/… но, похоже, он не указывает на немедленные изменения
Показать ещё 1 комментарий
Теги:
security
ssl
paypal

2 ответа

1
Лучший ответ

Хорошо, мой хостинг-провайдер сообщил мне, что, возможно, один из корневых сертификатов PayPals был обновлен до того, который не находится в хранилище ключей Java. И что я должен обновить с моего довольно старого Java 6 до Java 7, перезапустив Tomcat, чтобы использовать Java 7, исправил проблему :)

3

Это очень распространенная проблема, когда веб-сервер или URL-адрес, к которому вы подключаетесь, не имеют действительного сертификата от уполномоченного центра сертификации.

Импортируйте сертификат сервера и установите его в хранилище ключей JDK, чтобы решить эту проблему.

Если вы откроете URL-адрес, который не имеет действительного сертификата, вы, вероятно, увидите диалоговое окно, предупреждающее вас о сертификате. Теперь нажмите "Открыть сертификат" и установите сертификат.

Или вы можете установить сертификат в свой браузер вручную.

В обоих случаях я предполагаю, что у вас есть сертификат с вами, импортированный в ваш браузер.

Теперь вам нужно установить это в хранилище ключей JDK сервера.

Обычно вы используете keytool для управления сертификатами. Keytool - это утилита командной строки с многочисленными аргументами, которые позволяют создавать и управлять хранилищами ключей для размещения цифровых сертификатов.

Перейдите в папку JDK jre/bin в командной строке. На моей машине C:\Program Files\Java\jdk1.7.0_15\jre\bin

C:\Program Files\Java\jdk1.7.0_15\jre\bin> keytool -list -keystore..\lib\security\cacerts

Введите пароль хранилища ключей: changeit

Команда Above отобразит все доступные сертификаты.

Теперь вам нужно добавить ранее установленный сертификат в это хранилище ключей. Чтобы добавить, начните с экспорта сертификата CA Root в виде двоичного файла с кодировкой DER и сохраните его как D:\root.cer. (вы можете просмотреть установленные сертификаты в разделе Tools-> "Свойства обозревателя" → Content-> Сертификаты. После открытия сертификатов найдите тот, который вы только что установили в разделе "Доверенные корневые центры сертификации". Выберите правильный и нажмите на 'export'. Теперь вы можете сохранить его (DER закодированный двоичный файл) под своим D: диском.

Теперь вы можете использовать следующую команду для импорта файла в хранилище ключей cacerts.

C:\Program Files\Java\jdk1.7.0_15\jre\bin> keytool -import -alias mycertificate -keystore..\lib\security\cacerts -file D:\root.cer

Введите пароль хранилища ключей: changeit

Доверять этому сертификату? [нет]: да Сертификат был добавлен в хранилище ключей

Вы можете проверить установленный сертификат, выполнив команду C:\Program Files\Java\jdk1.7.0_15\jre\bin> keytool -list -keystore..\lib\security\cacerts

Если вы найдете свои сертификаты, подтвердите, что вы успешно установили сертификаты в хранилище ключей JDK.

  • 0
    Эти ошибки происходят на моем сервере, когда он пытается подтвердить платеж Paypla, поэтому у меня нет браузера или чего-то подобного, у меня есть только доступ к командной строке, как мне поступить
  • 0
    @PaulTaylor Как уже упоминалось выше, попробуйте запускать команды через командную строку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню