将 .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,我需要执行以下操作吗?
- 创建一个自签名的 jks 文件
- 将 .key 和 .pem 导入新的 test.jks 文件?
执行以下操作
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
命令来完成。
服务团队向我提供了以下 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,我需要执行以下操作吗?
- 创建一个自签名的 jks 文件
- 将 .key 和 .pem 导入新的 test.jks 文件?
执行以下操作
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
命令来完成。