禁用HTTPS的公用名检查的安全隐患

时间:2008-09-26 10:54:32

标签: security ssl https certificate

我正在浏览一些我通过HTTPS进行安全通信所继承的客户端代码,似乎它没有检查服务器证书中的通用名称(例如'CN =“example.com”'请求的实际URL。这可能是故意的,因为我们的客户端应用程序需要与各种环境进行通信,因此在联系初始门户网站(例如example.com/main)和用户选择环境后,应用程序将被重定向到特定的IP,因此所有未来的请求看起来都像“http://127.0.0.1/page”。

然而,作为SSL新手,我不确定禁用此检查的含义。我的第一反应是,执行某种中间人攻击更容易,因为其他人可以复制我们的证书并伪装成我们的服务器之一。但是,如果我们进行常见的名称检查,您仍然可以使用自定义DNS设置执行相同的操作,因此它似乎并没有真正获得任何东西。是否有其他攻击让我们开放,否则我们不会这样做?

由于

6 个答案:

答案 0 :(得分:10)

其他人无法复制您的证书并使用它,因为他们没有您的私钥。

如果您没有检查证书的CN与域名不匹配,那么他们可以简单地创建自己的证书(并让它由受信任的CA签名,使其看起来有效),用它代替您的,并且在中间攻击中扮演一名男子。

此外,您需要检查证书是否来自受信任的CA.这是CA的工作,以确保您只能获得CN =的证书,如果您实际控制该域。

如果您跳过其中任何一项检查,那么您将面临MITM攻击的风险。

另请参阅this answer,了解如果您对客户有足够的控制权,将采用的其他方法。

答案 1 :(得分:4)

如果您控制客户端代码,则可以将受信任的CA限制为您自己的CA.然后,域检查不太重要 - 您的任何服务器都可以伪装成另一个服务器。

如果您不控制客户端代码,则可以替换由您信任的CA签署的证书。

答案 2 :(得分:3)

$ 0.02:不推荐使用CN作为主机名,而应使用X.509主题备用名称。

答案 3 :(得分:2)

  • 验证证书本身并且可以将其链接到您已经信任的CA证书,这样您就可以检查证书是否真实有效。
  • 如果您确认证书确实有效,那么检查证书中的主机名可以让您检查是否正在与要与之通话的服务器通话。
  • (检查远程方确实是持有该证书私钥的那方是在SSL / TLS握手中完成的。)

如果您想要为人们进行护照/身份证检查的类比:

  • 验证证书就像检查护照或身份证件是否真实一样。您可以决定从一个人那里接受哪种形式的身份证明(例如护照,驾驶执照,工作人员卡......)以及您信任的哪些发行国能够验证其真实性。
  • 检查远程方是持有私钥的人是否类似于检查护照/身份证上的图片是否与您面前的人的面部相匹配。
  • 检查主机名就像检查护照属于您正在寻找姓名的人一样。

如果您没有查看主机名,任何拥有您认为是真实有效护照的人都可以来找您并声称他们是您正在寻找的那个(按名称)。

在非常有限的情况下,您只信任特定CA或自签名证书,您允许任何潜在证书冒充您信任的整套证书中的任何其他证书,忽略此验证是可以接受的,但这种情况非常罕见,而且不是很好的做法。

检查护照上的姓名是否与您正在寻找的人的姓名相符,这将被视为常识;也为证书做。不这样做允许任何拥有您信任的证书的人冒充您信任的任何其他证书,从而可能执行MITM攻击。

HTTPS主机名验证规则在RFC 2818 Section 3.1中定义(最近也在“最佳做法”规范RFC 6125中定义,尚未实施)。

简而言之,主机名应该在主题备用名称DNS条目中(尽管您可以回退到证书中没有SAN的主题DN的CN)。当您使用IP地址时,IP地址必须位于SAN IP地址条目中(尽管某些浏览器可以让您使用主题DN的CN中的IP地址)。

答案 4 :(得分:0)

要对“自定义DNS设置”执行相同操作,攻击者应利用DNS服务器(您的或客户端)将example.com指向他控制的IP,而不是仅复制证书。如果可能,我会将所有特定应用程序创建为example.com的子域,并使用通配符证书(* .example.com)来验证CN。

答案 5 :(得分:0)

主机名验证(验证CN部分)可确保连接(服务器)的另一端与您在地址栏中键入的域名发生SSL证书问题。通常情况下,攻击者无法获得此类证书。

如果你没有验证主机名部分,那么某人(有人坐在请求通过的任何路由器或代理服务器上)可以在中间攻击中做一个人。或者有人可以利用一些DNS攻击。