安全,服务器证书和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验证对于确保网络安全至关重要。始终遵循安全最佳实践,确保数据传输的安全和完整性。

相关推荐
路由侠内网穿透16 分钟前
外网访问 WebDav 服务
大数据·服务器
是阿建吖!44 分钟前
【Linux】操作系统
linux·运维·服务器
一只小菜鸡..44 分钟前
241114.学习日志——[CSDIY] [CS]数据结构与算法 [00]
linux·服务器·学习
XY.散人1 小时前
初识Linux · 信号产生
linux·运维·服务器
好奇的菜鸟1 小时前
Go语言中的类型
服务器·前端·golang
黑客K-ing2 小时前
人工智能大模型即服务时代:在网络安全中的应用
网络·安全·web安全·网络安全·php
CertiK2 小时前
CertiK安全调研报告:Web3.0桌面钱包的初步安全评估
安全·web3·区块链
难以触及的高度2 小时前
MySQL5.7.37安装配置
linux·运维·服务器
安全狗新闻3 小时前
等保二级需要哪些安全设备?
网络·安全·web安全
zhuqiyua3 小时前
windows二进制安全零基础(二)
汇编·安全·二进制