javax.net.ssl.SSLPeerUnverifiedException疑问:匹配证书通配符仍报错?
SSLPeerUnverifiedException:通配符证书匹配失败问题解析
错误信息
javax.net.ssl.SSLPeerUnverifiedException: Certificate for <g.i.t.n.c.com> doesn't match any of the subject alternative names: [*.t.n.c.com]
问题原因
你遇到的问题是通配符证书的匹配规则限制:
根据RFC 2818规范,证书中的通配符*.t.n.c.com仅能匹配t.n.c.com的直接子域名(即单个域名标签替换通配符),比如xxx.t.n.c.com。而你的目标主机g.i.t.n.c.com是t.n.c.com的下两级域名(孙子域名),不在该通配符的匹配范围内。
Apache HttpClient 4.5.9严格遵循这一规范进行主机名验证,因此会抛出该异常。
解决方案
1. 调整证书(推荐生产环境使用)
- 直接将
g.i.t.n.c.com添加到证书的Subject Alternative Names(SAN)字段中; - 如果需要匹配该层级的所有子域名,可以申请包含
*.i.t.n.c.com的证书(同样遵循单层级通配规则)。
2. 临时绕过主机名验证(仅测试环境使用)
如果是测试场景,可通过关闭HttpClient的主机名验证绕过该错误,但绝对禁止在生产环境使用,会带来严重安全风险:
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.conn.ssl.NoopHostnameVerifier; CloseableHttpClient httpClient = HttpClients.custom() .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build();
3. 注意事项
升级HttpClient版本无法解决该问题,因为所有遵循RFC规范的HTTP客户端都会执行相同的通配符匹配逻辑,核心矛盾在于证书与目标主机的域名层级不匹配。
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

