这个话题花了我很长时间才弄明白。有零碎零散的信息,人们必须把所有的东西都放在一起。我希望通过这篇文章,我能帮助其他人快速组装出一个可行的解决方案。
我有一个client-cert.pem
、client-key.pem
和一个root.pem
文件,我需要在我的Java中使用它们来访问远程REST。
如何将它们打包到信任库中,并使用它们进行API调用?
发布于 2018-12-10 16:21:06
为了将证书加载到应用程序中,您需要将它们打包到信任库中。
创建信任库
鉴于这3份档案:
client-cert.pem
client-key.pem
root.pem
在终端中运行以下命令。用您想要的密码替换PASSWORD
。
PKCS12
信任存储文件。默认情况下,它创建一个JKS
文件,该文件是一种专有格式。通过指定-deststoretype PKCS12
,您将创建一个行业标准格式的文件。
密钥工具-importkeystore \ -destkeystore truststore.pfx -deststoretype PKCS12 -deststorepass密码\ -srckeystore client.pfx -srcstorepass密码-srcstoretype PKCS12 \ -alias qlikClient注意,在上面的命令中,我们对密钥库和信任库都使用相同的PASSWORD
。您也可以使用不同的密码。还要注意,您必须为添加到信任库的每个项指定一个别名。
如果您希望信任库信任系统中所有可用的仙人掌,请在步骤2或步骤3中添加-trustcacerts
选项。
可以使用以下命令列出信任存储的内容
keytool -list -keystore truststore.pfx -storepass PASSWORD
在应用程序中使用信任存储
一旦有了信任库,就需要将其加载到应用程序中。假设您有一个常量KEYSTORE_PATH
保存到信任库的路径,而keyStorePass
保存密码,则将信任存储文件读入KeyStore
中。
private KeyStore readStore() {
try (InputStream keyStoreStream = new FileInputStream(KEYSTORE_PATH)) {
KeyStore keyStore = KeyStore.getInstance("PKCS12"); // or "JKS"
keyStore.load(keyStoreStream, keyStorePass.toCharArray());
return keyStore;
} catch (KeyStoreException | CertificateException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
创建自定义SSLContext
和自定义HttpClient
,
final KeyStore truststore = readStore();
final SSLContext sslContext;
try {
sslContext = SSLContexts.custom()
.loadTrustMaterial(truststore, new TrustAllStrategy())
.loadKeyMaterial(truststore, keyStorePass.toCharArray(), (aliases, socket) -> "qlikClient")
.build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException | UnrecoverableKeyException e) {
throw new RuntimeException("Failed to read keystore", e);
}
final CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
现在您可以使用这个HttpClient
向您的API发出请求。
HttpResponse response = httpClient.execute(new HttpGet("https://sense-gcp-central1eu.net:4242/qrs/app/full"));
或者,如果使用的是OpenUnirest/unirest-java库,则可以配置Unirest以使用自定义HttpClient
Unirest.config().httpClient(httpClient);
HttpResponse<JsonNode> response = Unirest.get("https://sense-gcp-central1eu.net:4242/qrs/app/full").asJson();
参考资料
https://stackoverflow.com/questions/53709608
复制相似问题