有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇太阳报。安全验证器。ValidatorException:PKIX路径生成失败

我已使用以下命令创建CSR请求:

openssl请求输出证书ECSR。csr-new-newkey rsa:2048-keyout certificatekey。钥匙

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

从那以后我就皈依了。提交至。p12使用按键

创建一个。p12使用CA发送的cer和私钥的证书

C:\Java\jdk1。6.0_38\jre\bin>;openssl pkcs12-export-in C:\Users\asharma1\cert.cer-inkey certificatekey。钥匙拔出

证书。p12

创建JKS密钥库:

keytool-genkey-alias quid-keystore quid。jks

导入。p12进入jks密钥库的证书

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

-现金。jks-类型jks

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

太阳。安全验证器。ValidatorException:PKIX路径生成失败:

太阳。安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效证书路径

我还向cacerts添加了cer文件。但还是有同样的错误

就JAVA代码而言,我引用这个链接是为了引用我自己创建的密钥库:

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");

请注意,我没有使用任何服务器。我试着只通过主方法运行上面的代码

请让我知道需要做什么。 为什么我需要转换我的。提交至。p12文件


共 (2) 个答案

  1. # 1 楼答案

    我建议您将CA证书(或整个CA链和中间CA)导入密钥库

    我认为p12是进口的。我的建议是将链导入keystore。至少错误信息是这么说的

    我想:

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

    您可以使用portecle导入丢失的受信任CA证书(而不是您在.p12或从颁发CA收到的单独的.cer文件中拥有的结束实体证书)。它比keytool更容易使用。跟着这个guide

  2. # 2 楼答案

    我建议你使用*。der格式,而不是。p12格式

    下面是如何导入证书以修复以下错误的总体摘要:

    Error while trying to execute request. 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. 转到浏览器中的URL,单击HTTPS证书链(URL地址旁边的小锁符号)导出证书
      • 单击“更多信息”>;“安全性”>;“展示证书”>;“细节”>;“出口……”
      • 另存为.der
      • 对需要导入的所有证书重复上述步骤
    2. 找到$JAVA_HOME/jre/lib/security/cacerts
    3. 全部导入*。使用以下命令将文件写入cacerts文件:

      sudo keytool -import -alias mysitestaging -keystore $JAVA_HOME/jre/lib/security/cacerts -file staging.der
      sudo keytool -import -alias mysiteprod -keystore  $JAVA_HOME/jre/lib/security/cacerts -file prod.der
      sudo keytool -import -alias mysitedev -keystore  $JAVA_HOME/jre/lib/security/cacerts -file dev.der
      
    4. 默认密钥库密码为'changeit'

    5. 您可以查看使用此命令所做的更改,该命令显示证书指纹

      keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
      
    6. 如果这不能解决问题,请尝试添加以下java选项作为参数:

      -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts"
      -Djavax.net.ssl.trustStorePassword="changeit"