安全,服务器证书和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验证行为。但请注意,禁用主机名验证会降低安全性。
java 复制代码
// 示例:创建一个信任所有证书的 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验证对于确保网络安全至关重要。始终遵循安全最佳实践,确保数据传输的安全和完整性。

相关推荐
Hello.Reader7 分钟前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
智驱力人工智能1 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
七夜zippoe1 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥1 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
数据与后端架构提升之路1 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
Fcy6482 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满2 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥3 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
市场部需要一个软件开发岗位3 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
lingggggaaaa3 小时前
安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征
学习·安全·web安全·免杀对抗