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

盖:

这个话题花了我很多时间弄清楚。零星的信息零散,人们必须将所有信息汇总在一起。我希望通过这篇文章可以帮助其他人快速组装一个可行的解决方案。


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

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

盖:

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

创建一个信任库

给定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您将创建一个行业标准格式的文件。

    keytool -importkeystore \
        -destkeystore truststore.pfx -deststoretype PKCS12 -deststorepass PASSWORD \
        -srckeystore client.pfx -srcstorepass PASSWORD -srcstoretype PKCS12 \
        -alias qlikClient
    
  3. 将您的根CA添加到信任库

    keytool -importcert \
        -keystore truststore.pfx -storepass PASSWORD \
        -file root.pem -noprompt \
        -alias qlikServerCACert
    

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

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

您可以使用以下命令列出信任库的内容

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();

参考文献

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

多客户端聊天应用程序在java中

来自分类Java

在gRPC Java应用程序中使客户端流同步/阻塞

来自分类Java

如何在gradle Java应用程序中包含来自openapi-generator的客户端?

来自分类Java

如何在Apache HttpClient中使用SSL客户端证书?

来自分类Java

如何使Java Swing应用程序成为客户端服务器应用程序?

来自分类Dev

如何在GO中使用CA证书创建TLS客户端?

来自分类Dev

如何在HTTPS中使用客户端证书?

来自分类Dev

如何在节点中使用客户端证书进行HTTPS GET

来自分类Dev

如何在WinForms客户端应用程序中使用命令模式?

来自分类Dev

在WebJob中使用客户端证书

来自分类Dev

如何在Scrapy中使用SSL客户端证书(p12)?

来自分类Dev

如何在Flutter应用中使用WebSocket客户端?

来自分类Java

如何在Java中使用Webclient添加CA证书和客户端证书

来自分类Dev

使用客户端证书的扭曲的HTTP客户端

来自分类Dev

如何在Rails5(API模式)应用程序的静态页面中使用ActionCable客户端?

来自分类Dev

如何在.Net Core中使用客户端SSL证书

来自分类Dev

如何在Spring Feign Client中使用P12客户端证书

来自分类Dev

使用客户端应用程序在非SSL中更新Amazon RDS SSL / TLS证书

来自分类Dev

如何在Blazor客户端应用程序中使用Bootstrap模态?

来自分类Dev

如何在应用程序客户端内部使用router.replace?

来自分类Dev

如何在客户端/服务器应用程序中区分多个客户端

来自分类Dev

IRC客户端应用程序,如何在python中使用select()

来自分类Dev

如何在JAVA中运行服务器-客户端应用程序

来自分类Dev

Java客户端应用程序会话恢复

来自分类Dev

如何使用Java的HTTP客户端库设置应用程序名称?

来自分类Dev

错误应用程序Java客户端-server

来自分类Dev

如何在 JAX-WS 客户端和客户端证书认证上指定客户端证书

来自分类Dev

Jetty:如何在应用程序代码中验证 SSL 客户端证书?

来自分类Dev

使用 websockets 同步 Flask 应用程序的客户端

Related 相关文章

  1. 1

    多客户端聊天应用程序在java中

  2. 2

    在gRPC Java应用程序中使客户端流同步/阻塞

  3. 3

    如何在gradle Java应用程序中包含来自openapi-generator的客户端?

  4. 4

    如何在Apache HttpClient中使用SSL客户端证书?

  5. 5

    如何使Java Swing应用程序成为客户端服务器应用程序?

  6. 6

    如何在GO中使用CA证书创建TLS客户端?

  7. 7

    如何在HTTPS中使用客户端证书?

  8. 8

    如何在节点中使用客户端证书进行HTTPS GET

  9. 9

    如何在WinForms客户端应用程序中使用命令模式?

  10. 10

    在WebJob中使用客户端证书

  11. 11

    如何在Scrapy中使用SSL客户端证书(p12)?

  12. 12

    如何在Flutter应用中使用WebSocket客户端?

  13. 13

    如何在Java中使用Webclient添加CA证书和客户端证书

  14. 14

    使用客户端证书的扭曲的HTTP客户端

  15. 15

    如何在Rails5(API模式)应用程序的静态页面中使用ActionCable客户端?

  16. 16

    如何在.Net Core中使用客户端SSL证书

  17. 17

    如何在Spring Feign Client中使用P12客户端证书

  18. 18

    使用客户端应用程序在非SSL中更新Amazon RDS SSL / TLS证书

  19. 19

    如何在Blazor客户端应用程序中使用Bootstrap模态?

  20. 20

    如何在应用程序客户端内部使用router.replace?

  21. 21

    如何在客户端/服务器应用程序中区分多个客户端

  22. 22

    IRC客户端应用程序,如何在python中使用select()

  23. 23

    如何在JAVA中运行服务器-客户端应用程序

  24. 24

    Java客户端应用程序会话恢复

  25. 25

    如何使用Java的HTTP客户端库设置应用程序名称?

  26. 26

    错误应用程序Java客户端-server

  27. 27

    如何在 JAX-WS 客户端和客户端证书认证上指定客户端证书

  28. 28

    Jetty:如何在应用程序代码中验证 SSL 客户端证书?

  29. 29

    使用 websockets 同步 Flask 应用程序的客户端

热门标签

归档