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

时间:2014-07-15 06:51:31

标签: java ssl certificate jks

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

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

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

现在我已经使用密钥将.cer文件转换为.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

certi.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

-destkeystore quid.jks -deststoretype JKS

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

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

sun.security.provider.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");

请注意我没有使用任何服务器。我正在尝试只运行上面的代码而不是主要的方法。

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

2 个答案:

答案 0 :(得分:2)

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

我认为p12进口很好。我建议将链条导入密钥库。至少这是错误信息所说的。

我认为:

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

您可以使用portecle导入丢失的可信CA证书(不是.p12中的最终实体证书,也不是您从颁发CA收到的单独的.cer文件)。它比keytool更友好。请按照guide

进行操作

答案 1 :(得分:1)

我建议您使用* .der格式而不是.p12格式。

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

  

尝试执行请求时出错。   javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException:PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径

如何导入证书

  1. 转到浏览器中的URL,点击HTTPS证书链(URL地址旁边的小锁符号)导出证书
    • 点击“更多信息”> “安全”> “show certificate”> “详情”> “出口..”。
    • 另存为 .der
    • 重复您需要导入的任何证书
  2. 找到 $ JAVA_HOME / jre / lib / security / cacerts
  3. 使用以下内容将所有* .der文件导入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"