如何使用带有SSL证书的https客户端从Java调用API

tvmytwxo  于 2024-01-05  发布在  Java
关注(0)|答案(1)|浏览(190)

我使用HttpClient从Java文件调用rest API。通过使用它,我可以调用http API,但不能调用https API。
我得到下面的错误,而调用httpsapi。

  1. javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  2. at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
  3. at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
  4. at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
  5. at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
  6. at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)
  7. at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
  8. at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
  9. at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
  10. at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
  11. at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
  12. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
  13. at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)

字符串
我想使用CloseableHttpClient调用https API。
我的证书文件中有私钥。请告诉我如何使用私钥调用API?

aydmsdu9

aydmsdu91#

要使用https调用API,您需要配置SSLContext并将其设置为您的HttpClient。请参考下面的示例代码。这只是示例,您可以以不同的方式加载keystore和truststore,例如从classpath,form file system等。,进行相应的更改。

  1. KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
  2. KeyStore identity = KeyStore.getInstance(KeyStore.getDefaultType());
  3. TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  4. trustManagerFactory.init(trustStore);
  5. KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  6. keyManagerFactory.init(identity, "password".toCharArray());
  7. SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
  8. sslContext.init(
  9. keyManagerFactory.getKeyManagers(),
  10. trustManagerFactory.getTrustManagers(),
  11. null
  12. );
  13. HttpClient httpClient = HttpClients.custom()
  14. .setSSLContext(sslContext)
  15. .setSSLHostnameVerifier(new DefaultHostnameVerifier())
  16. .build();

字符串

展开查看全部

相关问题