错误解决:No subject alternative DNS name matching xxx

错误情况

最近在请求别人域名下载的时候,报了如下错误:
在这里插入图片描述

什么是Subject Alternative name?

我们想要解决错误,首先需要了解这是一个什么样的错。所以网上看了一些关于证书的消息

The Subject Alternative Name field lets you specify additional host names (sites, IP addresses, common names, etc.) to be protected by a single SSL Certificate, such as a Multi-Domain (SAN) or Extend Validation Multi-Domain Certificate.

可以看出 Subject Alternative name 是用来定义多个域名、ip地址等,实现一个证书认证多个地址多个域名。
具体的解释请参考:

Multi-Domain (SAN) Certificates - Using Subject Alternative Names

参考图片如下:
在这里插入图片描述
所以我们之前报的错,问题就在于 证书中的 DNS name 字段无法匹配 报错中的网址(也就是我打了马赛克的部分)
知道了问题,我们就可以开始着手解决它

解决

域名实际情况

首先我们看下这个域名的实际情况:
网址如下:https://myssl.com/
我们随便拿一个举下例子
在这里插入图片描述
在这里插入图片描述
可以看到这个域名有两个证书信息,一个整数是当前域名的,另一个看起来是阿里云的。

检查返回情况
openssl s_client -connect adtest-mc.sm.cn:443 -showcerts

结果一般如下:在这里插入图片描述
服务器证书的主题是 CN=*.alicdn.com,这表明这是一个通配符证书,可以匹配以 .alicdn.com 结尾的所有子域名。
根据上面 myssl 的结果,.alicdn.com这个证书里面是不包含 *.sm.cn的域名的

这时候两个办法:
第一,有可能是自己服务器缓存了这个证书和域名,所以我们先尝试重启服务器后重新调用上面的命令,不行的话第二步
第二,找域名的提供方(可能是你的甲方)修改他们的 nginx 策略,在从域名 *.sm.cn 请求时需要返回sm.cn的证书而不是阿里云的,这个属于错误返回

执行SSL协议是在http通信之前,此时nginx并不知道客户端请求的是哪一个服务器。
当我的程序请求的时候,nginx不知道我要访问哪个https服务,于是就给了一个默认服务即*.alicdn.com证书,导致了上述异常的发生。
这就解答了为什么我请求的是sm.cn的域名,服务端却给我一个alicdn.com的证书这个问题,
然后就是SNI协议,感兴趣可以了解下
在该协议下,在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。
这允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全(HTTPS)网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书

所以我们需要在nginx中指定请求中域名与证书的映射关系,例如我请求中带的是 sm.cn,你就应该给我返回一个 sm.cn 的域名而不是 阿里云的
当然,甲方可能并不同意你的观点,不改哈哈哈
第三步,那就只能跳过 ssl 校验了,网上基本都是这个办法,这个方法不是解决问题根源的方式,但是人生在世哪有一切都如自己意的呢?

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常是由于SSL证书中的主题备用名称(SAN)不包含您正在尝试连接的主机名引起的。这意味着您的Java客户端无法验证SSL证书,因为它无法验证证书是否与您正在尝试连接的主机名匹配。解决此问题的方法是将证书添加到Java信任存储中,或者在代码中禁用SSL证书验证。以下是两种解决方法: 1. 将证书添加到Java信任存储中 ```shell # 下载证书 openssl s_client -connect example.com:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.crt # 将证书添加到Java信任存储中 keytool -import -alias example -keystore $JAVA_HOME/jre/lib/security/cacerts -file example.crt ``` 2. 在代码中禁用SSL证书验证 ```java import javax.net.ssl.*; import java.security.cert.X509Certificate; public class SSLUtil { public static void turnOffSslChecking() throws NoSuchAlgorithmException, KeyManagementException { // 创建一个不验证证书链的信任管理器 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()); // 获取一个不验证证书链的HostnameVerifier实例 HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); } } ``` 在需要禁用SSL证书验证的代码中调用`SSLUtil.turnOffSslChecking()`即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值