为什么不信任所有的http证书

时间:2012-04-27 14:21:21

标签: .net security ssl

我编写了一个资源管理器处理程序,用于为组织中的几个不同站点提供资源(js / css)。大多数站点都是内部的,但有一些是外部站点并使用ssl。 QA / Dev站点与证书的域名不同,因此要求我使用回调进行自定义验证。我理解我可以做一些事情,比如检查我的环境,只有在生产时才返回true或检查域名,如果它与我的qa / dev域匹配则返回true。我的问题不是怎么做,而是为什么?为什么我接受资源处理程序的所有证书是不安全的?用户实际可以做些什么恶意的事情?

ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
public static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors)
{
     return true;//Why not do this?
}

更新:想想我可能需要对处理程序的功能添加一些说明。通过此处理程序的所有资源请求都经过哈希处理。处理程序解密请求并通过从程序集中提取资源或通过请求项目自己的本地资源来提供资源。域不匹配发生的唯一时间是我的处理程序请求本地资源。回想起来,我想也许我应该以不同的方式处理,但是就我原来的问题而言,我仍然没有看到MITM攻击如何应用,并且觉得在这种情况下接受所有证书是安全的,但我不是100%为什么我把它带到这里。 :)

3 个答案:

答案 0 :(得分:4)

这违背了HTTPS的目的。

如果您接受所有证书,任何人都可以使用自签名证书进行中间人攻击,并且它可以正常工作。

答案 1 :(得分:1)

你需要验证你与谁交换秘密的身份,否则他们可能是冒名顶替者。

从客户端到服务器,活动的MITM攻击者可以使用自己的证书并将流量转发到正版站点,而无需您注意。在Security.SE: Downside of allowing uncertified Certificates上查看此问题。

接受客户端证书(从服务器的角度来看)。您将still exchange data secretly与客户联系,但您不会告诉您客户是谁。客户端证书用于身份验证,您可以通过允许任何事情而无需额外验证(并使此步骤无用)来绕过。

编辑(您刚刚从服务器端的角度添加了它):

据推测,您所做的是接受任何证书,然后将其包含的名称作为用户的身份。这样做的缺点是你实际上并没有进行任何身份验证:你只是接受用户声称面值的名称。这有点像接受一张纸说“我的名字是X”而不是检查正式身份证(例如护照)。

答案 2 :(得分:1)

您将容易受到中间人攻击,因为您信任提交给您的任何证书。

只有当攻击者可以模仿每个端点以满足另一个端点时,中间人攻击才能成功 - 这是对相互身份验证的攻击(或缺乏)。 < / p>

http://en.wikipedia.org/wiki/Man-in-the-middle_attack