我连接了VPN来设置库存API来获取产品列表,它工作得很好。一旦我从web-service得到结果并绑定到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
发布于 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:
keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>
它很可能会要求您输入密码。Java附带的默认密码是changeit
。几乎没人会改变它。完成这些相对简单的步骤后,您将安全地进行通信,并确保您正在与正确的服务器通信,并且只与正确的服务器通信(只要他们没有丢失私钥)。
发布于 2011-07-19 11:52:31
现在我用这种方式解决了这个问题,
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
安装所需证书的场景,例如使用临时证书进行本地测试。
发布于 2011-07-15 01:53:36
我相信您正在尝试使用SSL连接到某物,但某物提供的证书未经根证书颁发机构(如verisign)验证。在本质上,默认情况下,只有当尝试连接的人知道交易对手的密钥,或者像verisign这样的其他人可以介入并说所提供的公钥确实是正确的时,才能建立安全连接。
所有操作系统都信任少数几个证书颁发机构和较小的证书颁发者,如果你明白我的意思,就需要由一个大的证书颁发机构来认证,从而形成一个证书链……
不管怎样,回到正题..在编写java applet和java服务器时,我遇到了类似的问题(希望有一天我会写一篇完整的博文,讲述我是如何让所有的安全性工作的:)
实际上,我要做的就是从服务器中提取公钥,并将其存储在applet中的密钥库中,当我连接到服务器时,我使用这个密钥库创建了一个信任工厂,并使用该信任工厂创建了ssl连接。还有一些替代过程,比如将密钥添加到JVM的受信任主机,以及在启动时修改缺省信任存储区。
我大约在两个月前做了这件事,现在我身上还没有源代码。使用谷歌,你应该能够解决这个问题。如果你不能给我回信,我可以为你提供项目的相关源代码..不知道这是否解决了您的问题,因为您没有提供导致这些异常的代码。此外,我正在使用applet,我不明白为什么它不能在Serverlet上工作……
附言:我在周末之前拿不到源代码,因为我的办公室禁用了外部SSH :(
https://stackoverflow.com/questions/6659360
复制相似问题