java - 太阳.security.validator.ValidatorException : PKIX path building failed

标签 java ssl certificate jks

我已经使用此命令创建了 CSR 请求:

openssl req -out certificatecsr.csr -new -newkey rsa:2048 -keyout certificatekey.key

之后 CA 与我共享了证书(.cer)文件。

现在,我已经使用 key 将 .c​​er 文件转换为 .p12。

使用 CA 发送的 cer 和私钥创建 .p12 证书

C:\Java\jdk1.6.0_38\jre\bin>openssl pkcs12 -export -in C:\Users\asharma1\cert.cer -inkey certificatekey.key -out

证书.p12

创建 JKS keystore :

keytool -genkey -alias quid -keystore quid.jks

将 .p12 证书导入 jks keystore

C:\Java\jdk1.6.0_38\jre\bin>keytool -v -importkeystore -srckeystore C:\OpenSSL-Win64\bin\certi.p12 -srcstoretype PKCS12

-destkeystore quid.jks -deststoretype JKS

但是当我从我的 java 代码中引用这个 JKS 时,我得到了这个错误:

sun.security.validator.ValidatorException:PKIX 路径构建失败:

sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

我也已将 cer 文件添加到 cacerts。但仍然出现相同的错误。

就 JAVA 代码而言,我引用此链接来引用我自己创建的 keystore :

http://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/

public SSLContext getSSLContext(String tspath) 
        throws Exception {

      TrustManager[] trustManagers = new TrustManager[] { 

        new ReloadableX509TrustManager(tspath) 
      };
      SSLContext sslContext = SSLContext.getInstance("TLS");

      sslContext.init(null, trustManagers, null);

      return sslContext;

    }

SSLContext sslContext=getSSLContext("C:\\Java\\jdk1.6.0_38\\jre\\bin\\quid.jks");
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
URL pickUrl = new URL(pickupLocation);
URLConnection urlConn = pickUrl.openConnection();
HttpsURLConnection httpsURLConn = (HttpsURLConnection)urlConn;
httpsURLConn.setSSLSocketFactory(socketFactory);
String encoding = urlConn.getContentEncoding();   
InputStream is = urlConn.getInputStream();    
InputStreamReader streamReader = new InputStreamReader(is, encoding != null
? encoding : "UTF-8");

请注意我没有使用任何服务器。我正在尝试仅通过主要方法在编写的代码之上运行。

请告诉我需要做什么。 为什么我需要将我的 .cer 文件转换为 .p12 文件?

最佳答案

我建议您将 CA 证书(或整个 CA 链和中间 CA)导入 keystore 。

我认为 p12 导入良好。我的建议是将链导入 keystore 。至少那是错误信息所说的。

我认为:

  • 链中的根 CA 不受信任,因此链构建失败或
  • 链中的证书中没有 AIA 部分,因此无法获取到受信任的根 CA 的证书,因此链构建失败或
  • 证书不是基于 AIA 获取的,因为它不是在 java 中实现的(我不是 java 程序员)所以链构建失败

你可以使用 portecle导入缺少的受信任 CA 证书(不是您在 .p12 中或在您从颁发 CA 收到的单独的 .cer 文件中拥有的最终实体证书)。它比 keytool 对用户更友好。跟着这个guide .

关于java - 太阳.security.validator.ValidatorException : PKIX path building failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24751682/

相关文章:

selenium - 如何强制 Firefox Selenium Webdriver(Python) 接受任何 SSL 证书

amazon-web-services - AWS IoT 证书突然失效

go - 检查证书的到期日期

java - 错误 :/home/retok/proj/src/com/hellow/app/HelloActivity. java:34: 预期为 ';'

java - 使用数学施加数值限制

c - 在通信中添加 TLS/SSL 层..?

java - createSocket、connect 和 connectionTimeout 的 HTTPS 问题

java - 用于测试的最小 postgres 实例

java - 具有属性的 UML 建模枚举

windows - 在 Windows 上创建 OpenSSL 证书