首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决javax.net.ssl.SSLHandshakeException错误?

如何解决javax.net.ssl.SSLHandshakeException错误?
EN

Stack Overflow用户
提问于 2011-07-12 12:03:10
回答 4查看 597.7K关注 0票数 114

我连接了VPN来设置库存API来获取产品列表,它工作得很好。一旦我从web-service得到结果并绑定到UI。而且,当我打电话要求付款时,我将PayPal集成到我的应用程序中,以进行快速结帐,我遇到了这个错误。我使用servlet进行后端处理。有谁能说出如何解决这个问题吗?

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-19 12:08:45

首先,您需要从您尝试连接的服务器获取公共证书。这可以通过多种方式来完成,例如联系服务器管理员并请求它、using OpenSSL to download it,或者,由于这似乎是一个HTTP服务器,使用任何浏览器连接到它,查看页面的安全信息,并保存证书的副本。(Google应该能够准确地告诉您如何针对您的特定浏览器执行操作。)

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

代码语言:javascript
复制
keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

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

票数 164
EN

Stack Overflow用户

发布于 2011-07-19 11:52:31

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

代码语言:javascript
复制
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安装所需证书的场景,例如使用临时证书进行本地测试。

票数 18
EN

Stack Overflow用户

发布于 2011-07-15 01:53:36

我相信您正在尝试使用SSL连接到某物,但某物提供的证书未经根证书颁发机构(如verisign)验证。在本质上,默认情况下,只有当尝试连接的人知道交易对手的密钥,或者像verisign这样的其他人可以介入并说所提供的公钥确实是正确的时,才能建立安全连接。

所有操作系统都信任少数几个证书颁发机构和较小的证书颁发者,如果你明白我的意思,就需要由一个大的证书颁发机构来认证,从而形成一个证书链……

不管怎样,回到正题..在编写java applet和java服务器时,我遇到了类似的问题(希望有一天我会写一篇完整的博文,讲述我是如何让所有的安全性工作的:)

实际上,我要做的就是从服务器中提取公钥,并将其存储在applet中的密钥库中,当我连接到服务器时,我使用这个密钥库创建了一个信任工厂,并使用该信任工厂创建了ssl连接。还有一些替代过程,比如将密钥添加到JVM的受信任主机,以及在启动时修改缺省信任存储区。

我大约在两个月前做了这件事,现在我身上还没有源代码。使用谷歌,你应该能够解决这个问题。如果你不能给我回信,我可以为你提供项目的相关源代码..不知道这是否解决了您的问题,因为您没有提供导致这些异常的代码。此外,我正在使用applet,我不明白为什么它不能在Serverlet上工作……

附言:我在周末之前拿不到源代码,因为我的办公室禁用了外部SSH :(

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6659360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档