如何解决javax.net.ssl.SSLHandshakeException Error?

我连接到VPN以设置库存API以获取产品列表,并且它工作正常。一旦我从Web服务获得结果并绑定到UI。此外,我还将PayPal与我的应用程序集成在一起,以便在我拨打付款电话时进行快速结帐,我遇到了此错误。我使用 servlet 进行后端流程。任何人都可以说如何解决这个问题吗?

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

答案 1

首先,您需要从尝试连接到的服务器获取公共证书。这可以通过多种方式完成,例如联系服务器管理员并要求它,使用OpenSSL下载它,或者,由于这似乎是一个HTTP服务器,使用任何浏览器连接到它,查看页面的安全信息,并保存证书的副本。(谷歌应该能够确切地告诉你该为你的特定浏览器做些什么。

现在,您已将证书保存在文件中,您需要将其添加到 JVM 的信任存储区中。对于 JRE 或 JDK,有一个名为 的文件,它随 Java 一起提供,包含众所周知的证书颁发机构的公共证书。要导入新证书,请以有权写入 cacert 的用户身份运行 keytool:$JAVA_HOME/jre/lib/security/$JAVA_HOME/lib/securitycacerts

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

它很可能会要求您输入密码。Java 附带的默认密码是 。几乎没有人改变它。完成这些相对简单的步骤后,您将安全地进行通信,并确保您正在与正确的服务器通信,并且只与正确的服务器通信(只要它们不会丢失私钥)。changeit


答案 2

现在我以这种方式解决了这个问题,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
        }
};

// Install the all-trusting trust manager
try 
{
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} 
catch (Exception e) 
{
    System.out.println(e);
}

当然,此解决方案应仅用于无法使用临时证书进行本地测试等方式安装所需证书的情况。keytool


推荐