经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
RestTemplate进行https请求时适配信任证书
来源:cnblogs  作者:香吧香  时间:2024/4/15 9:49:06  对本文有异议

转载请注明出处:

1.http协议请求

  使用RestTemplate进行http协议的请求时,不需要考虑证书验证相关问题,以下为使用RestTemplate直接使用的代码示例:

  1. import org.springframework.web.client.RestTemplate;
  2. import org.springframework.http.ResponseEntity;
  3. import org.springframework.http.HttpMethod;
  4. import org.springframework.http.HttpEntity;
  5. import org.springframework.http.HttpHeaders;
  6. public class HttpRestClient {
  7. public static void main(String[] args) {
  8. RestTemplate restTemplate = new RestTemplate();
  9. String url = "http://example.com/api/endpoint"; // 注意这里是HTTP协议
  10. HttpHeaders headers = new HttpHeaders();
  11. // 可以在这里添加请求头,如果需要的话
  12. HttpEntity<?> requestEntity = new HttpEntity<>(headers);
  13. try {
  14. ResponseEntity<String> responseEntity = restTemplate.exchange(
  15. url,
  16. HttpMethod.GET, // 或者使用其他HTTP方法,如POST、PUT等
  17. requestEntity,
  18. String.class // 指定响应体的类型
  19. );
  20. // 处理响应
  21. if (responseEntity.getStatusCode().is2xxSuccessful()) {
  22. String responseBody = responseEntity.getBody();
  23. System.out.println("Response: " + responseBody);
  24. } else {
  25. System.out.println("Request failed with status: " + responseEntity.getStatusCode());
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

2.Https请求信任所有证书:

  在Java中,使用RestTemplate进行HTTP请求时,默认情况下它会验证HTTPS证书的有效性。如果想要忽略HTTPS证书验证(这通常不推荐,因为它会降低安全性),需要自定义一个HttpClient并设置它忽略SSL证书验证。

  以下是一个示例,展示了如何为RestTemplate创建一个自定义的HttpClient,该HttpClient将忽略HTTPS证书验证:

  1. 创建一个忽略SSL证书验证的HttpClient

  1. import org.apache.http.conn.ssl.NoopHostnameVerifier;
  2. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  3. import org.apache.http.impl.client.CloseableHttpClient;
  4. import org.apache.http.impl.client.HttpClients;
  5. import org.apache.http.ssl.SSLContexts;
  6. import javax.net.ssl.SSLContext;
  7. import java.security.KeyManagementException;
  8. import java.security.NoSuchAlgorithmException;
  9. public CloseableHttpClient createTrustingHttpClient() throws NoSuchAlgorithmException, KeyManagementException {
  10. SSLContext sslContext = SSLContexts.custom()
  11. .loadTrustMaterial(null, (chain, authType) -> true) // 信任所有证书
  12. .build();
  13. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
  14. return HttpClients.custom()
  15. .setSSLSocketFactory(sslsf)
  16. .build();
  17. }

 

  2.使用自定义的HttpClient创建RestTemplate

 

  1. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  2. import org.springframework.web.client.RestTemplate;
  3. public RestTemplate createRestTemplateWithTrustingHttpClient() throws NoSuchAlgorithmException, KeyManagementException {
  4. HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
  5. factory.setHttpClient(createTrustingHttpClient());
  6. return new RestTemplate(factory);
  7. }

  3.使用RestTemplate进行请求

  1. public void makeRequest() throws NoSuchAlgorithmException, KeyManagementException {
  2. RestTemplate restTemplate = createRestTemplateWithTrustingHttpClient();
  3. String url = "https://example.com/api/endpoint";
  4. RequestEntity<?> requestEntity = RequestEntity.get(URI.create(url)).build();
  5. ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
  6. // 处理响应...
  7. }  

注意

  • 忽略SSL证书验证会降低你的应用的安全性,因为它容易受到中间人攻击。在生产环境中,你应该始终验证SSL证书。

  • 如果确实需要忽略证书验证,确保完全了解相关的安全风险,并在完成后尽快恢复正常的证书验证。

3.自定义加载证书

  在Java中使用RestTemplate进行HTTPS请求时,如果需要加载特定的HTTPS证书,通常需要使用一个自定义的HttpClient,并配置SSL上下文以加载你的证书。以下是一个使用Apache HttpClient和Spring RestTemplate加载特定HTTPS证书的示例:

  1. 创建自定义的HttpClient

  需要创建一个自定义的HttpClient,并配置SSL上下文以加载你的证书。

  1. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  2. import org.apache.http.impl.client.CloseableHttpClient;
  3. import org.apache.http.impl.client.HttpClients;
  4. import org.apache.http.ssl.SSLContexts;
  5. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  6. import org.springframework.web.client.RestTemplate;
  7. import javax.net.ssl.KeyManagerFactory;
  8. import javax.net.ssl.SSLContext;
  9. import javax.net.ssl.TrustManagerFactory;
  10. import java.io.FileInputStream;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.security.KeyStore;
  14. import java.security.KeyStoreException;
  15. import java.security.NoSuchAlgorithmException;
  16. import java.security.cert.CertificateException;
  17. public class CustomRestTemplate {
  18. public static RestTemplate createRestTemplateWithCustomSSL() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {
  19. // 加载你的证书和私钥
  20. KeyStore keyStore = KeyStore.getInstance("PKCS12");
  21. try (InputStream certStream = new FileInputStream("path/to/your/cert.p12")) {
  22. keyStore.load(certStream, "password".toCharArray()); // 替换为你的证书密码
  23. }
  24. KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  25. keyManagerFactory.init(keyStore, "password".toCharArray()); // 替换为你的证书密码
  26. TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  27. trustManagerFactory.init(keyStore);
  28. SSLContext sslContext = SSLContexts.custom()
  29. .loadKeyMaterial(keyManagerFactory, "password".toCharArray()) // 替换为你的证书密码
  30. .loadTrustMaterial(trustManagerFactory)
  31. .build();
  32. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.NO_HOSTNAME_VERIFIER);
  33. CloseableHttpClient httpClient = HttpClients.custom()
  34. .setSSLSocketFactory(sslsf)
  35. .build();
  36. HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
  37. return new RestTemplate(requestFactory);
  38. }
  39. }

  在上面的代码中,你需要替换path/to/your/cert.p12为你的证书文件路径,以及替换password为你的证书密码。

  2.使用自定义的RestTemplate

  现在你可以使用上面创建的RestTemplate实例进行HTTPS请求了。

  1. public class MyService {
  2. private final RestTemplate restTemplate;
  3. public MyService() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {
  4. this.restTemplate = CustomRestTemplate.createRestTemplateWithCustomSSL();
  5. }
  6. public String makeHttpsRequest(String url) {
  7. return restTemplate.getForObject(url, String.class);
  8. }
  9. }

 

原文链接:https://www.cnblogs.com/zjdxr-up/p/18134532

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号