【问题标题】:Import .key and .pem file to jks file and use in Java/Spring将 .key 和 .pem 文件导入 jks 文件并在 Java/Spring 中使用
【发布时间】:2016-10-02 14:34:55
【问题描述】:

我从一个服务团队获得了以下密钥/证书,以通过 SSL 调用他们的 API,我通过 curl 命令验证了这一点。

1. QA.test.key
2. QA.test.pem 

CURL 命令:

curl --key QA.test.key --cert ./QA.test.pem -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d '{"pan":"1234567890123456", "client": " Application Name "}' https://test-qa.abc.com/tokenize

现在,要通过 https 调用 Java 中的 API,我需要执行以下操作吗?

  1. 创建一个自签名的 jks 文件
  2. 将 .key 和 .pem 导入新的 test.jks 文件?
  3. 执行以下操作

    public class TestApp {
    
    final static String KEYSTORE_PASSWORD = "testing";
    
    static
    {
        System.setProperty("javax.net.ssl.trustStore", "src/main/resources/test.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", KEYSTORE_PASSWORD);
        System.setProperty("javax.net.ssl.keyStore",  "src/main/resources/test.jks");
        System.setProperty("javax.net.ssl.keyStorePassword", KEYSTORE_PASSWORD);
    }
    
    
    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
    

    }

我在使用 jks 文件时收到 Invalid Certificate 错误,创建 jks 文件并导入 .key 和 .pem 文件以使其正常工作的最佳方法是什么?

【问题讨论】:

    标签: java ssl keytool pem jks


    【解决方案1】:

    创建 jks 最简单的方法是使用 GUI 工具 portecle http://portecle.sourceforge.net

    创建 JKS> 导入密钥/对

    您还可以使用 keytool 和 OpenSSL。检查这个importing an existing x509 certificate and private key in Java keystore to use in ssl

    假设您需要一个用于客户端证书的 keyStore 和一个用于服务器证书的 trustStore。通常客户端证书也包含它们。如果不是,请在 JKS 中包含证书(与其他文件相同)

    要调用和发送 json,您可以使用 httpsURLconnection

      HttpsURLConnection conn =       (HttpsURLConnection)url.openConnection();
      conn.setSSLSocketFactory(sslFactory);
      conn.setMethod("POST");
      conn.setDoOutput(true);
      conn.setRequestProperty("Content-Type","application/json"); 
      conn.connect();
      OutputStream os = conn.getOutputStream();
      os.write(jsonString.getBytes());
      os.flush();
      os.close(); 
    

    要创建一个socketFactory,你可以使用

      SSLContext sc = SSLContext.getDefault();
      SSLSocketFactory sslFactory =  sc.getSocketFactory();
    

    这里有一个完整的示例(使用 java 代码创建信任库和密钥库)How can I use different certificates on specific connections?

    如果您遇到 SSL 连接问题,请添加

     System.setProperty("javax.net.debug", "ssl");
    

    【讨论】:

      【解决方案2】:

      使用 OpenSSL 实用程序创建一个 PKCS #12 文件。然后,您可以使用系统属性将其指定为您的密钥库。

      openssl pkcs12 -export -in QA.test.pem -inkey QA.test.key -out test.pkcs12
      

      此命令将提示输入密码以加密新的 PKCS #12 文件。它还可能提示输入用于加密QA.test.key 的密码(如果有)。

      javax.net.ssl.keyStore=test.pkcs12 javax.net.ssl.keyStorePassword= javax.net.ssl.keyStoreType=PKCS12

      trustStore 属性是独立的;它们影响如何验证服务器。如果服务器使用由“真实”CA 颁发的证书,则必要的证书应该已经存在于 Java 运行时中。否则,您必须创建一个额外的密钥库,这可以使用 Java 的 keytool 命令来完成。

      注意Java 9 will use PKCS #12 files as the default 密钥库类型。

      【讨论】:

        猜你喜欢
        • 2017-02-01
        • 2016-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 2023-03-28
        相关资源
        最近更新 更多