【问题标题】:Why am I suddenly getting 'PKIX path building failed' error when processing Paypal payment为什么我在处理 Paypal 付款时突然收到“PKIX 路径构建失败”错误
【发布时间】:2015-05-28 21:23:36
【问题描述】:

基于 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.getOutputStream() 上

这是个例外

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 

【问题讨论】:

  • PayPal 最近发出通知,表示他们正在升级证书。
  • @EJP 确实有更多信息,我找到了这个odoo.com/fr_FR/forum/help-1/question/…,但它似乎并不表示立即发生变化
  • 我想你应该在上周自己收到了这封电子邮件。

标签: java security ssl paypal


【解决方案1】:

当您连接的网络服务器或 URL 没有来自授权 CA 的有效证书时,这是一个非常常见的问题。

导入服务器证书并将其安装在 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

以上命令将列出所有可用的证书。

现在您必须将先前安装的证书添加到此密钥库。要添加,首先将您的 CA 根证书导出为 DER 编码的二进制文件并将其保存为 D:\root.cer。 (您可以在“工具”->“Internet 选项”->“内容”->“证书”下查看已安装的证书。打开证书后,在“受信任的根证书颁发机构”下找到刚刚安装的证书。选择正确的证书并单击“ 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 密钥库。

【讨论】:

  • 这些错误发生在我的服务器上,因为它试图验证 Paypla 付款,所以我没有浏览器或类似的东西我只有命令行访问权限,我应该如何继续
  • @PaulTaylor 如上所述尝试通过命令行运行命令。
【解决方案2】:

好的,我的托管服务提供商告诉我,PayPal 的根证书之一可能已更新为不在 Java 密钥库中的证书。我应该从我相当旧的 Java 6 更新到 Java 7,重新启动 Tomcat 以使用 Java 7 解决了这个问题 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2014-02-09
    • 2021-03-13
    相关资源
    最近更新 更多