首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在客户端java应用程序中使用客户端证书?

如何在客户端java应用程序中使用客户端证书?
EN

Stack Overflow用户
提问于 2018-12-10 16:20:21
回答 1查看 10.4K关注 0票数 4

这个话题花了我很长时间才弄明白。有零碎零散的信息,人们必须把所有的东西都放在一起。我希望通过这篇文章,我能帮助其他人快速组装出一个可行的解决方案。

我有一个client-cert.pemclient-key.pem和一个root.pem文件,我需要在我的Java中使用它们来访问远程REST。

如何将它们打包到信任库中,并使用它们进行API调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-10 16:21:06

为了将证书加载到应用程序中,您需要将它们打包到信任库中。

创建信任库

鉴于这3份档案:

  • client-cert.pem
  • client-key.pem
  • root.pem

在终端中运行以下命令。用您想要的密码替换PASSWORD

  1. 将客户端密钥和证书打包到密钥存储库中。这将创建一个PKCS12密钥库文件。 openssl pkcs12 -export \ -inkey client-key.pem -in client-cert.pem \ -out client.pfx -passout pass:PASSWORD \ -name qlikClient
  2. 将密钥库添加到信任库中。如果目标没有退出,它将创建一个信任库。这将创建一个PKCS12信任存储文件。默认情况下,它创建一个JKS文件,该文件是一种专有格式。通过指定-deststoretype PKCS12,您将创建一个行业标准格式的文件。 密钥工具-importkeystore \ -destkeystore truststore.pfx -deststoretype PKCS12 -deststorepass密码\ -srckeystore client.pfx -srcstorepass密码-srcstoretype PKCS12 \ -alias qlikClient
  3. 将根CA添加到信任存储区 密钥工具-importcert \ -keystore truststore.pfx -storepass密码\ -file root.pem -noprompt \ -alias qlikServerCACert

注意,在上面的命令中,我们对密钥库和信任库都使用相同的PASSWORD。您也可以使用不同的密码。还要注意,您必须为添加到信任库的每个项指定一个别名。

如果您希望信任库信任系统中所有可用的仙人掌,请在步骤2或步骤3中添加-trustcacerts选项。

可以使用以下命令列出信任存储的内容

代码语言:javascript
运行
复制
keytool -list -keystore truststore.pfx -storepass PASSWORD

在应用程序中使用信任存储

一旦有了信任库,就需要将其加载到应用程序中。假设您有一个常量KEYSTORE_PATH保存到信任库的路径,而keyStorePass保存密码,则将信任存储文件读入KeyStore中。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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发出请求。

代码语言:javascript
运行
复制
HttpResponse response = httpClient.execute(new HttpGet("https://sense-gcp-central1eu.net:4242/qrs/app/full"));

或者,如果使用的是OpenUnirest/unirest-java库,则可以配置Unirest以使用自定义HttpClient

代码语言:javascript
运行
复制
Unirest.config().httpClient(httpClient);
HttpResponse<JsonNode> response = Unirest.get("https://sense-gcp-central1eu.net:4242/qrs/app/full").asJson();

参考资料

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53709608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档