繁体   English   中英

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

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

我从服务团队获得了以下密钥/证书,通过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文件以使其正常工作的最佳方法是什么?

使用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属性是分开的; 它们会影响如何验证服务器。 如果服务器使用由“真实”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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM