我想知道为什么如果我尝试使用ip地址而不是域名访问网站,我会收到证书错误。让我们说例如nslookup
说google.com
是173.194.43.96
,所以我试图浏览https://173.194.43.96并且我收到证书错误,说明本网站提供的安全证书是针对不同的网站的地址。为什么会这样?
答案 0 :(得分:7)
这是因为为特定域名颁发了SSL证书。如果证书名称与访问域不匹配,则浏览器将显示错误。
SSL的一个主要功能是向用户证明他们确实正在连接到他们请求的站点,而不是伪装成终端站点的攻击者。如果不将域名链接到证书,则无法实现。
可以想象,浏览器证书系统可能被设计为在证书中包含IP地址,但这将使得难以使用DNS负载平衡甚至更改主机提供商,因为新证书必须是每次发生这种情况都会发出如果证书仅包含IP地址而不包含域,则这将使用户无法抵御DNS欺骗攻击。因此,前进的唯一方法就是单独使用域名。
感兴趣的是,IP地址为possible to obtain an SSL certificate - 由于Google是他们自己的证书颁发机构,他们可以为173.194.43.96颁发证书,从而可以安全地浏览谷歌ip地址,只要他们使用SNI提供正确的证书。似乎难以置信的是,这值得额外复杂但是......
如果您想了解更多内容,这是对SSL的一个很好的介绍:
答案 1 :(得分:1)
证书是发给www.google.com的,而不是IP地址。因此,您的浏览器无法验证证书,该证书将www.google.com列为实体。
有关详细信息,请参阅:www.digicert.com/ssl-support/certificate-name-mismatch-error.htm
答案 2 :(得分:1)
在MAC High Sierra和Python 3.6.4上,我尝试了解决方案:requests toolbelt:HostHeaderSSLAdapter首先,不幸的是,它对我不起作用,然后我尝试了 forcediphttpsadapter,终于有了效果。
作者解释了自述文件中的所有内容,并提供了示例脚本,可以轻松地对其进行操作。
1。通过pip install requests[security] forcediphttpsadapter
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)
注意:在某些情况下,您可能需要从网址中删除前缀“ www”。
答案 3 :(得分:0)
通用名称通常由主机+域名组成,看起来像www.yoursite.com
或yoursite.com
。 SSL服务器证书特定于它们在主机级别颁发的公用名。通用名称必须与连接到安全站点时要访问的Web地址相同。例如,如果访问名为domain.com
或www.domain.com
的网站,secure.domain.com
和www.domain.com
不同,则域secure.domain.com
的SSL服务器证书将收到警告来自domain.com
。