将 .key 和 .pem 文件导入 jks 文件并在 Java/Spring 中使用

Import .key and .pem file to jks file and use in Java/Spring

服务团队向我提供了以下 key/cert 以通过 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 文件时收到无效证书错误,创建 jks 文件并导入 .key 和 .pem 文件以使其正常工作的最佳方法是什么?

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

创建 JKS> 导入 key/pair

您还可以使用 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");

使用 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=<whatever you entered when creating PKCS #12>
javax.net.ssl.keyStoreType=PKCS12

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

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