使用IP地址而不是DNS名称访问服务器时,我收到错误的证书错误。
是否在tls1.1中新引入了此功能。和tls 1.2?如果有人指出OpenSSL代码失败并返回错误的证书错误,那将是件好事。
答案 0 :(得分:5)
为什么我们在使用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/...
使用其他用户代理连接,那么如果证书包含 {{ 1}} 强>;否则就失败了。
颁发/验证政策
有两个机构主导发布/验证政策。它们是CA/Browser Forum和Internet Engineering Task Force (IETF)。
浏览器,如Chrome,Firefox和Internet Explorer,请点击CA/B Baseline Requirements(CA / B BR)。
其他用户代理(如cURL和Wget)遵循IETF颁发和验证政策,例如RFC 5280, Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile和RFC 6125, Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)。 RFC对CA / B发布策略更为宽松。
用户代理
不同的用户代理具有适用于DNS名称的不同策略。有些人希望在DNS中找到传统的主机名,而其他人则需要IP地址。
浏览器仅允许主题备用名称(SAN)中的DNS主机名。如果SAN中缺少主机名,则匹配将不会发生。将服务器名称放在 Common Name 中是浪费时间和精力,因为浏览器需要SAN中的主机名。
浏览器 不 匹配SAN中的公共IP地址。他们有时允许来自RFC 1918, Address Allocation for Private Internets的私有IP。
其他用户代理允许主题备用名称(SAN)中的任何名称。它们还将匹配 Common Name(CN)和 Subject Alternate Name(SAN)中的名称。名称包含DNS名称,例如 www.xxx.yyy.zzz
,公共IP地址,私有IP地址,例如 www.example.com
以及 192.168.10.10
和 localhost
等本地名称。
OpenSSL版本
OpenSSL版本1.0.2及以下 没有 执行主机名验证。也就是说,你必须自己进行匹配。如果您没有自己执行主机名验证,则表明连接始终成功。另请参阅OpenSSL wiki上的Hostname Validation和TLS Client。
OpenSSL 1.1.0及更高版本执行主机名匹配。如果你切换到1.1.0,那么你应该开始遇到失败如果你没有自己匹配主机名,或者你没有严格遵守发布政策。
如果有人指出失败的OpenSSL代码并返回错误的证书错误,那将是件好事。
签到发生在2015年初,从那时起,它们已在Master(即1.1.0-dev)中可用。该代码也可以在1.0.2中使用,但您必须执行特殊操作。例程在1.0.1或更低版本中不可用。另请参阅OpenSSL wiki上的Hostname Validation。我没有Git签到,因为我现在在Windows机器上。
有关姓名及其位置规则的更多信息,请访问How do you sign Certificate Signing Request with your Certification Authority和How to create a self-signed certificate with openssl。至少还有四到六个文档可以覆盖它们,例如需要为HTTP Strict Transport Security (HSTS)和Public Key Pinning with Overrides for HTTP呈现的内容。