Ssl 为什么通过IP地址而不是主机名连接到服务器时验证失败?

Ssl 为什么通过IP地址而不是主机名连接到服务器时验证失败?,ssl,openssl,certificate,ssl-certificate,x509certificate,Ssl,Openssl,Certificate,Ssl Certificate,X509certificate,使用IP地址而不是DNS名称访问服务器时,我收到错误的证书错误 这是tls1.1中新引入的功能。和TLS1.2?如果有人指出OpenSSL代码失败的地方并返回坏证书错误,那就好了 为什么在使用IP地址而不是dns名称访问服务器时会出现错误的证书 这取决于发布/验证策略、用户代理和您正在使用的OpenSSL版本。因此,为了给您一个准确的答案,我们需要更多地了解您的配置 一般来说,假设www.example.com的IP地址为www.xxx.yyy.zzz。如果您通过https://www.exam

使用IP地址而不是DNS名称访问服务器时,我收到错误的证书错误

这是tls1.1中新引入的功能。和TLS1.2?如果有人指出OpenSSL代码失败的地方并返回坏证书错误,那就好了

为什么在使用IP地址而不是dns名称访问服务器时会出现错误的证书

这取决于发布/验证策略、用户代理和您正在使用的OpenSSL版本。因此,为了给您一个准确的答案,我们需要更多地了解您的配置

一般来说,假设
www.example.com
的IP地址为
www.xxx.yyy.zzz
。如果您通过
https://www.example.com/...
,则连接应成功。如果您使用浏览器通过
https://www.xxx.yyy.zzz/...
那么它应该总是失败。如果您使用另一个用户代理通过
https://www.xxx.yyy.zzz/...
如果证书包含
www.xxx.yyy.zzz
,则应该成功;否则就会失败

发布/验证策略

有两个机构主导发布/验证政策。它们是,和

浏览器,如Chrome、Firefox和Internet Explorer,遵循(CA/B BR)

其他用户代理,如cURL和Wget,遵循IETF发布和验证策略,如和。RFC比CA/B发布策略更宽松

用户代理

不同的用户代理具有适用于DNS名称的不同策略。一些人希望在DNS中找到传统的主机名,而另一些人则允许IP地址

浏览器仅允许主题备用名称(SAN)中的DNS主机名。如果SAN中缺少主机名,则不会发生匹配。将服务器名称放在公共名称中是浪费时间和精力的,因为浏览器需要SAN中的主机名

浏览器与SAN中的公共IP地址不匹配。他们有时会允许来自的私有IP

其他用户代理允许主题备用名称(SAN)中的任何名称。它们还将匹配通用名(CN)和主题备用名(SAN)中的名称。名称包括一个DNS名称,如
,一个公共IP地址,一个私有IP地址,如
192.168.10.10
,以及一个本地名称,如
localhost
localhost.localdomain

OpenSSL版本

OpenSSL 1.0.2及以下版本未执行主机名验证。也就是说,您必须自己进行匹配。如果您自己没有执行主机名验证,那么连接似乎总是成功的。另请参见OpenSSL wiki上的和

OpenSSL 1.1.0及更高版本执行主机名匹配。如果切换到1.1.0,那么如果您没有执行主机名匹配,或者您没有严格遵守发布策略,那么您应该开始遇到故障


如果有人指出OpenSSL代码失败的地方并返回坏证书错误,那就好了

签入发生在2015年初,自那时起,它们已在Master(即1.1.0-dev)中可用。该代码在1.0.2中也可用,但您必须执行特殊操作。例程在1.0.1或更低版本中不可用。另请参见OpenSSL wiki上的。我没有Git签入,因为我现在在Windows机器上



有关名称及其位置规则的更多信息,请访问和。至少还有四到六个文档涉及到它们,比如如何为和提供内容。

在您的案例中,证书是针对“the.domain.com”颁发的,该值与IP地址字符串的值完全不同,这是证书工作的基础。为什么不直接连接到域名?哪个版本的openssl包含主机名验证?有没有办法连接到私有IP地址,但告诉连接到它的代理,它希望CN是“someCNname.com”?或者这个代理依赖于。我知道,例如,对于mbedtls,您可以将服务器地址(server_addr)指定为192.168.210.5,但如果您还将服务器名称(server_name)指定为“theservername.com”,例如,如果证书的CN为“theservername.com”,则连接将成功。