当前位置: 首页 > news >正文

JDK 8调用HTTPS POST接口的SSL配置

对于JDK 8调用HTTPS接口,需要进行适当的SSL配置。以下是针对JDK 8的修改方案:

java

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;
import java.nio.charset.Charset;
import java.security.cert.X509Certificate;public static String getResult(String url, String param) {String returnValue = null;try {// 创建SSL上下文,信任所有证书(适用于测试环境)SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] chain, String authType) {return true; // 信任所有证书}}).build();// JDK 8 不支持 TLSv1.3,只使用 TLSv1.2SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,new String[]{"TLSv1.2"}, // JDK 8 只支持到 TLSv1.2null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());// 创建HTTP客户端CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();try {RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(60000).build();HttpPost httppost = new HttpPost(url);httppost.addHeader("Content-type", "application/json; charset=utf-8");httppost.setHeader("Accept", "application/json");httppost.addHeader("User-Agent", "");httppost.setConfig(config);StringEntity entity = new StringEntity(param, Charset.forName("UTF-8"));httppost.setEntity(entity);HttpResponse resp = httpclient.execute(httppost);if (resp.getStatusLine().getStatusCode() == 200) {HttpEntity he = resp.getEntity();String respContent = EntityUtils.toString(he, "UTF-8");returnValue = respContent;}} catch (Exception e) {e.printStackTrace();} finally {try {httpclient.close();} catch (Exception e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();returnValue = "SSL configuration failed";}return returnValue;
}

JDK 8 特有的注意事项

  1. TLS版本限制

    • JDK 8 最高支持到 TLSv1.2,不支持 TLSv1.3

    • 在代码中明确指定只使用 TLSv1.2,避免尝试使用 TLSv1.3

  2. 密码套件配置

    • 如果需要,可以指定特定的密码套件:

    java

    SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,new String[]{"TLSv1.2"},new String[]{"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_GCM_SHA384"}, // 指定密码套件SSLConnectionSocketFactory.getDefaultHostnameVerifier());
  3. 系统属性配置

    • 可以通过设置系统属性来全局配置SSL:

    java

    System.setProperty("https.protocols", "TLSv1.2");
    System.setProperty("jdk.tls.client.protocols", "TLSv1.2");

生产环境配置

对于生产环境,建议使用更安全的配置:

java

// 加载信任库
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
try (InputStream is = new FileInputStream("truststore.jks")) {trustStore.load(is, "changeit".toCharArray());
}// 创建SSL上下文
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, null).build();// 创建SSL连接工厂
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,new String[]{"TLSv1.2"},null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());// 创建HTTP客户端
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();

常见问题解决

  1. 证书验证失败

    • 确保服务器证书受信任

    • 或者将服务器证书添加到信任库

  2. 协议版本不匹配

    • 确保客户端和服务器支持相同的TLS版本

    • JDK 8 需要更新到最新版本以支持更安全的协议

  3. 密码套件不匹配

    • 确保客户端和服务器有共同的密码套件

调试技巧

要启用SSL调试,可以添加以下JVM参数:

text

-Djavax.net.debug=ssl

这将输出详细的SSL握手信息,帮助诊断连接问题。

总结

对于JDK 8调用HTTPS接口,关键点是:

  1. 只使用 TLSv1.2(JDK 8不支持 TLSv1.3)

  2. 正确配置SSL上下文和信任策略

  3. 根据环境选择适当的证书验证策略

  4. 在生产环境中使用正确的信任库配置


文章转载自:

http://EKSYES6V.jrqcj.cn
http://Ukdnfi1Y.jrqcj.cn
http://WcrYRQ56.jrqcj.cn
http://r5MkZcBf.jrqcj.cn
http://ZnTscL9E.jrqcj.cn
http://1oA2MM63.jrqcj.cn
http://xxgs3rwg.jrqcj.cn
http://0I5uOpSM.jrqcj.cn
http://80WcZTIK.jrqcj.cn
http://6tg7MxhI.jrqcj.cn
http://Ka38fx6h.jrqcj.cn
http://UsUVF9SL.jrqcj.cn
http://Cl3zKFDJ.jrqcj.cn
http://WZIqMFOK.jrqcj.cn
http://9hrHUHcP.jrqcj.cn
http://ypt2fEI7.jrqcj.cn
http://tmcWER6P.jrqcj.cn
http://bIdKIWz4.jrqcj.cn
http://2nVZX4cg.jrqcj.cn
http://lbARSHxX.jrqcj.cn
http://EII2xs3g.jrqcj.cn
http://SgA7Ahlu.jrqcj.cn
http://nBh58ia2.jrqcj.cn
http://rqCAU24h.jrqcj.cn
http://7BBZq6St.jrqcj.cn
http://CDHPE8Fu.jrqcj.cn
http://3BYpIg3v.jrqcj.cn
http://VXwC6Ue8.jrqcj.cn
http://V5o41Xif.jrqcj.cn
http://ZGOHythi.jrqcj.cn
http://www.dtcms.com/a/384230.html

相关文章:

  • HTTPS 的加密
  • 基于 EPGF 架构理念的 FaceFusion 3.4.1 本地 .venv 部署教程(非 Conda 环境部署优化版)
  • RabbitMQ 高级功能与优化篇
  • Node.js 高级应用:负载均衡与流量限制
  • Capistrano 让Ruby应用部署变得优雅又简单!
  • [计算机毕业设计]基于深度学习的噪声过滤音频优化系统研究
  • 02-Media-8-uvc_with_csc.py 使用硬件解码的USB摄像头(UVC)捕获视频并显示的程序
  • 【Java】P2 Java 学习路线与JVM、注释方法
  • 【论文阅读—智能驾驶】Diving Deeper Into Pedestrian Behavior Understanding
  • 【论文阅读】LG-VQ: Language-Guided Codebook Learning
  • AI摘桃记:精准率(P-Precision)、召回率(R-Recall)、F1-Score之争
  • 分布式专题——12 RabbitMQ之应用开发
  • 软件可靠性设计:高可用性架构实战——双机热备与集群技术
  • Mac 真正多显示器支持:TESmart USB-C KVM(搭载 DisplayLink 技术)如何实现
  • 鼠标光标消失、触摸板失灵?仅用键盘 3 步救回
  • 漏洞无效化学习
  • 蓝牙鼠标频繁卡顿?一招解决 Win10/11 的 USB 省电机制干扰问题
  • 吱吱企业即时通讯保障企业通讯安全,提升企业部门协作效率
  • 中宇联云计算SD-WAN的售后服务怎么样
  • 【矩阵局部最大值】2022-11-16
  • 矩阵的特征值与特征向量:定义、几何意义与在信号处理中的应用
  • RabbitMQ的文档介绍及使用
  • Python对象序列化完全指南:从基础到高级实战
  • 机器学习实战项目中,回归与分类模型中该如何科学定义目标变量Y?
  • 【Docker】docker容器的使用
  • 【Pywinauto库】13.3 pywinauto.xml_helpers内部模块
  • vue3 基本教程-运行一个最小demo
  • [JavaWeb]在学习Servlet的过程中一个经典面试题
  • 安全测试技能 | web、app、PC应用测试面试题梳理
  • 金融数据--集思录可转债等权指数