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

安全,服务器证书和SSL连接

业务报错:

javax.net.ssl.SSLPeerUnverifiedException: Certificate for <10.5.20.137> doesn’t match any of the subject alternative names: [*.dt.zte.com.cn]
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:507)

这个异常表明服务器提供的 SSL 证书中的主体备用名称(Subject Alternative Name,简称 SAN)与客户端尝试连接的服务器的主机名或 IP 地址不匹配

证书问题:服务器提供的 SSL 证书是为了 *.dt.zte.com.cn 这个域名或通配符域名颁发的。这意味着证书可以被用于任何以 dt.zte.com.cn 结尾的域名。

主机名不匹配:你尝试连接的服务器的 IP 地址是 <10.5.20.137>,这个 IP 地址并不匹配证书中的任何 SAN 条目。证书中的 SAN 条目是为域名设计的,而不是 IP 地址。

验证失败:由于主机名(在这个情况下是 IP 地址)与证书中的 SAN 条目不匹配,Java 的 SSL 握手过程中的主机名验证失败了,因此抛出了 SSLPeerUnverifiedException 异常。


服务器证书和SSL验证是网络安全通信的重要组成部分,它们确保了数据传输的安全性和可靠性。以下是一些关键概念和步骤,帮助你理解服务器证书和SSL验证:

1. SSL/TLS 协议

  • SSL(Secure Sockets Layer)TLS(Transport Layer Security) 是两个加密协议,用于在互联网通信中提供安全和数据完整性。
  • SSL 现在主要被 TLS 取代,但这两个术语经常互换使用。

2. 数字证书

  • 数字证书是一种电子文档,用于证明某个实体(如网站、服务器或用户)的身份,并包含公钥信息。
  • 证书由可信的第三方机构(称为证书颁发机构,CA)签发。

3. 主体备用名称(SAN)

  • SAN 是 X.509 证书的一个扩展,允许在单个证书中包含多个域名或IP地址。
  • 这使得单个证书可以用于多个不同的主机名,提高了灵活性。

4. SSL 验证过程

  • 客户端发起连接:当客户端(如浏览器)尝试与服务器建立安全连接时,服务器会提供其SSL证书
  • 证书验证客户端会检查证书的有效性,包括证书是否由受信任的CA签发、证书是否过期、证书的主体名称是否与请求的主机名匹配等。
  • 加密通信:如果证书验证通过,客户端和服务器将使用证书中的公钥进行密钥交换,然后使用对称加密算法进行安全通信。

5. 处理证书错误

  • 如果证书验证失败(例如,证书不是由受信任的CA签发、证书过期、主机名不匹配等),客户端会显示安全警告。
  • 在开发环境中,你可能会遇到自签名证书或未正确配置的证书,这会导致SSL验证错误。

6. 禁用 SSL 验证(不推荐)

  • 在某些情况下,你可能需要禁用SSL验证以进行调试。然而,这会使应用容易受到中间人攻击,因此不推荐在生产环境中这样做。

7. 解决方案

  • 确保证书正确配置:检查服务器证书是否包含正确的主机名和SAN
  • 更新证书:如果证书过期或需要更新,及时更新证书
  • 使用受信任的CA:确保证书由受信任的CA签发
  • 客户端配置:在客户端正确配置SSL/TLS设置,以确保安全通信。

8. Java中的SSL验证

  • 在Java应用中,你可以通过配置SSLContextTrustManager来自定义SSL验证行为。但请注意,禁用主机名验证会降低安全性。
// 示例:创建一个信任所有证书的 TrustManager(不推荐)
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() { return null; }public void checkClientTrusted(X509Certificate[] certs, String authType) { }public void checkServerTrusted(X509Certificate[] certs, String authType) { }}
};// 初始化 SSLContext
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

总之,正确配置和管理服务器证书以及SSL验证对于确保网络安全至关重要。始终遵循安全最佳实践,确保数据传输的安全和完整性。

http://www.lryc.cn/news/485216.html

相关文章:

  • Java结合ElasticSearch根据查询关键字,高亮显示全文数据。
  • Design Compiler:Topographical Workshop Lab2
  • 【C语言】连接陷阱探秘(1):声明与定义
  • ChatGPT学术专用版,一键润色纠错+中英互译+批量翻译PDF
  • python isinstance(True, int)
  • 1.5寸**进口 128128带灰阶oled屏 spi串口 老王电子diy 设备 OLED 2024/11/15 arduino
  • 【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)
  • 机器学习 ---线性回归
  • 深度学习每周学习总结J5(DenseNet-121 +SE 算法实战与解析 - 猴痘识别)
  • VBA学习笔记:点击单元格显示指定的列
  • windows C#-LINQ概述
  • vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)
  • R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...
  • C++ 关于类与对象(中篇)一篇详解!(运算符重载)
  • Scala的set
  • Linux---常用shell脚本
  • windows二进制安全零基础(二)
  • git常用命令+搭vscode使用
  • 如何在C#中处理必盈接口返回的股票数据?
  • 01 最舒适的python开发环境
  • 【PyTorch】libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent
  • 快速利用c语言实现线性表(lineList)
  • 量子计算与人工智能的交汇:科技未来的新引擎
  • 51单片机使用NRF24L01进行2.4G无线通信
  • HelloMeme 上手即用教程
  • 自定义call方法和apply方法
  • typescript中为js文件提供类型声明
  • ETH挖矿显卡超频信息汇总
  • 调用 Xinference OpenAI接口时报错 Model not found in the model list, uid
  • 一文说清:C静态库与动态库的区别