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

我从服务团队获得了以下密钥/证书,通过SSL调用他们的API,我通过curl命令对其进行了validation。

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文件以使其正常工作的最佳方法是什么?

使用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 = <创建PKCS#12时输入的内容>
 javax.net.ssl.keyStoreType = PKCS12

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

请注意, Java 9将使用PKCS#12文件作为默认密钥库类型。

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

创建JKS>导入密钥/对

您还可以使用keytool和OpenSSL。 选中此项导入Java密钥库中的现有x509证书和私钥以在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代码创建信任库和密钥库) 如何在特定连接上使用不同的证书?

如果您在添加SSL连接时遇到问题

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