1

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

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

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

现在,我使用密钥将 .c​​er 文件转换为 .p12。

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

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

证书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:无法找到请求目标的有效证书路径

我还将 cer 文件添加到 cacerts.但仍然遇到相同的错误。

就 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 文件?

4

2 回答 2

2

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

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

我假设:

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

您可以使用portecle导入缺少的受信任 CA 证书(不是您在 .p12 或您从颁发 CA 收到的单独 .cer 文件中拥有的最终实体证书)。它比 keytool 更加用户友好。只需按照本指南

于 2014-07-15T07:39:47.733 回答
1

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

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

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

如何导入证书

  1. 在浏览器中转到 URL,单击 HTTPS 证书链(URL 地址旁边的小锁符号)以导出证书
    • 单击“更多信息”>“安全”>“显示证书”>“详细信息”>“导出..”。
    • 另存为.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"
    
于 2016-10-18T19:43:46.977 回答