[英]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,我是否需要执行以下操作?
请执行下列操作
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.