Ssl 使用IP地址访问https站点

Ssl 使用IP地址访问https站点,ssl,Ssl,我想知道,如果我试图访问一个ip地址而不是域名的站点,为什么会出现证书错误。例如,假设nslookup说google.com是173.194.43.96,因此我尝试浏览,但发现证书错误,说明此网站提供的安全证书是针对不同网站的地址颁发的。为什么会这样?这是因为为特定域名颁发了SSL证书。如果证书名称与访问的域不匹配,浏览器将显示错误 SSL的主要功能之一是向用户证明他们确实在连接到他们请求的站点,而不是向伪装成终端站点的攻击者。如果不将域名链接到证书,这将是不可能的 可以想象,浏览器证书系统可以

我想知道,如果我试图访问一个ip地址而不是域名的站点,为什么会出现证书错误。例如,假设
nslookup
google.com
173.194.43.96
,因此我尝试浏览,但发现证书错误,说明此网站提供的安全证书是针对不同网站的地址颁发的。为什么会这样?

这是因为为特定域名颁发了SSL证书。如果证书名称与访问的域不匹配,浏览器将显示错误

SSL的主要功能之一是向用户证明他们确实在连接到他们请求的站点,而不是向伪装成终端站点的攻击者。如果不将域名链接到证书,这将是不可能的

可以想象,浏览器证书系统可以设计为在证书中包含IP地址,但这将使使用DNS负载平衡甚至更改主机提供商变得困难,因为每次发生这种情况时都必须颁发新的证书。如果证书仅包含IP地址而不包含域,则用户将无法抵御DNS欺骗攻击。因此,唯一的出路就是单独使用域名

有趣的是,这是一个IP地址——由于谷歌是他们自己的证书颁发机构,他们可以为自己颁发173.194.43.96的证书,从而可以通过IP地址安全浏览谷歌,只要他们使用SNI提供正确的证书。这似乎是难以置信的,这将值得额外的复杂性,但

如果您想阅读更多内容,这是对SSL的一个很好的介绍:


普通名称通常由主机+域名组成,看起来像
www.yoursite.com
yoursite.com
。SSL服务器证书特定于在主机级别向其颁发证书的公用名称。公共名称必须与连接到安全站点时要访问的网址相同。例如,如果访问名为
www.domain.com
secure.domain.com
的站点,域
domain.com
的SSL服务器证书将收到警告,由于
www.domain.com
secure.domain.com
不同于
domain.com

,发生的情况是证书颁发给www.google.com,而不是其IP地址。因此,您的浏览器将无法验证证书,该证书将www.google.com列为实体


有关更多信息,请参阅:

在MAC High Sierra和Python 3.6.4上,我尝试了解决方案:首先,不幸的是,它对我不起作用,然后我尝试了 ,终于成功了

作者解释了自述部分中的所有内容,并提供了一个示例脚本,可以很容易地遵循

1.通过
pip安装请求[security]forcediphttpAdapter安装库

2.运行示例脚本:

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)
注意:在某些情况下,您可能需要从url中删除前缀:“www”。

事实上,对于真正的(公共)证书,CommonName(在Subject中)大约从2010年起已被SubjectAlternativeName extension(缩写为SAN)取代,尽管Chrome在真正的SAN中重新使用错误代码“COMMON\u NAME\u INVALID”(公共名称无效)。