SSL和中间人的误解

我已经阅读了大量与这个问题有关的文档,但是我仍然无法把所有的东西放在一起,所以我想问几个问题。

  1. 首先,我将简要地描述一下我所了解的authentication程序,因为我可能会在这方面弄错:客户端启动一个连接,服务器通过公钥,元数据和数字签名的组合来响应可信的权威。 然后,如果客户信任服务器,客户端会做出决定,使用公钥对一些随机会话密钥进行encryption并将其发回。 此会话密钥只能使用存储在服务器上的私钥解密。 服务器执行此操作,然后HTTPS会话开始。

  2. 所以,如果我上面说得对,问题是在这种情况下中间人攻击会如何发生? 我的意思是,即使有人用公共密钥拦截了服务器(例如www.server.com)的响应,并且有一些手段让我认为他是www.server.com,但他仍然无法解密我的会话密钥没有私钥。

  3. 说到相互身份validation,关于服务器对客户身份的信心是否全部? 我的意思是,客户端已经可以确定她正在与正确的服务器进行通信,但现在服务器想要知道客户是谁,对吗?

  4. 最后一个问题是关于相互authentication的替代scheme。 如果我在所描述的情况下充当客户端,那么在SSL会话build立之后,如果我在HTTP头中发送了一个login名/密码呢? 正如我所看到的,这些信息不能被拦截,因为连接已经安全,服务器可以依靠它来进行识别。 我错了吗? 与相互authentication相比,这种方法有什么缺点(只有安全问题是重要的,而不是实现的复杂性)?

中间人对SSL的攻击只有在SSL的前提条件被破坏的情况下才可能发生,下面是一些例子。

  • 服务器密钥已被窃取 – 意味着攻击者可能看起来是服务器,并且客户端无法知道。

  • 客户信任一个不可信的CA(或者有一个被盗的根密钥) – 拥有一个可信的CA密钥的人可以生成假装成服务器的证书,客户将信任它。 由于今天浏览器中已经存在CA的数量,这可能是一个真正的问题。 这意味着服务器证书似乎会更改为另一个有效的证书,这是大多数客户端将隐藏的东西。

  • 客户端不会根据可信CA的列表正确地validation证书,任何人都可以创build一个CA. 没有validation,“本的汽车和证书”似乎与Verisign一样有效。

  • 客户端受到攻击,并且伪造的CA已经被注入了他的信任根权限 – 允许攻击者生成他喜欢的任何证书,客户端将信任它。 恶意软件往往会这样做,例如将您redirect到假银行网站。

特别是#2是相当讨厌的,即使你支付了高度信任的证书,你的网站也不会以任何方式locking到该证书,你必须信任客户端浏览器中的所有 CA,因为它们中的任何一个都可以生成伪造的证书您的网站也是一样有效的。 它也不需要访问服务器或客户端。

首先我会简单地描述authentication过程,据我所知,也许我误会了这一步。 因此,一个客户端启动一个连接,一个服务器用公钥,一些元数据和一个可信任的权威机构的数字签名进行响应。

服务器响应X.509证书链和使用自己的私钥签名的数字签名。

然后,如果客户信任服务器,客户端会做出决定

正确。

用公钥encryption一些随机的会话密钥并发送回去。

不可以。客户端和服务器参与相互会话密钥生成过程,由此会话密钥本身从不被传送。

此会话密钥只能使用存储在服务器上的私钥解密。

没有。

服务器这样做

没有。

然后HTTPS会话开始。

TLS / SSL会话开始,但是首先有更多的步骤。

那么,如果我是正确的,问题是在这种情况下中间人攻击会如何发生?

通过伪装成服务器并充当SSL端点。 客户将不得不省略任何授权步骤。 可悲的是,大多数HTTPS会话中唯一的授权步骤是主机名检查。

我的意思是,即使有人用服务器(例如www.server.com)拦截了公钥,然后用一些方法让我认为他是www.server.com,他仍然无法解密我的会话密钥没有私钥。

往上看。 没有会话密钥解密。 SSL连接本身是安全的,这就是你在跟谁说话 ,可能不安全。

说到相互身份validation,关于服务器对客户身份的信心是否全部? 我的意思是,客户端已经可以确定她正在与正确的服务器进行通信,但现在服务器想要找出谁是客户端,对吗?

正确。

最后一个问题是关于相互authentication的替代scheme。 如果我在所描述的情况下充当客户端,那么在SSL会话build立之后,如果我在HTTP头中发送了一个login名/密码呢? 正如我所看到的,这个信息不能被拦截,因为连接已经安全,服务器可以依靠它来进行识别。 我错了吗?

没有。

与相互authentication相比,这种方法有什么缺点(只有安全问题是重要的,而不是实现的复杂性)?

它只与用户名/密码一样安全,比私钥更容易泄漏。

任何人在客户端和服务器之间的道路上可以在https中的一个中间人攻击的人。 如果您认为这不太可能或罕见,请考虑有商业产品系统地解密,扫描和重新encryption通过互联网网关的所有 sslstream量 。 他们通过向客户端发送一个ssl证书,通过从“真实的”ssl证书复制的细节创build,但是使用不同的证书链进行签名。 如果这个链终止于任何浏览器的可信CA,这个MITM对用户是不可见的。 这些产品主要销售给公司,以“保护”(警察)企业networking,并应使用用户的知识和同意。 但从技术上讲,没有任何东西阻止他们使用ISP或任何其他networking运营商。 (假设NSA 至less有一个受信任的根CA签名密钥是安全的)

如果您正在提供一个页面,则可以包含一个HTTP标头,指明该页面应该签名的公钥。 这可能有助于提醒用户MITM他们的“安全”连接,但这是一种先用信任技术。 如果鲍勃还没有“真正的”公共密钥引脚的logging,Mallory只是重写文档中的pkp头。 使用这种技术的网站列表是令人沮丧的。 它包括谷歌和Dropbox,他们的信用。

关于密码,https连接上的所有内容都是通过https保护的,除了域名之外,这个域名必须清楚,以便请求能被路由。 一般来说,build议不要把密码放在查询string中,他们可以在日志,书签等处挂起来。但是除非https被攻破,查询string是不可见的。

  1. 正确
  2. 不太正确。 在这种types的攻击中,中间服务器得到您的请求,并代表您将其发送到目的地。 然后回应你的结果。 其实它是中间人服务器,使你与你的安全连接,而不是你想要沟通的实际服务器。 这就是为什么你必须总是检查证书是有效和可信的。
  3. 可能是正确的
  4. 如果您确定安全连接是可信的,那么可以安全地发送用户名/密码。

除了关于会话密钥的部分外,你所说的一切都是正确的。 CA的重点在于打败中间人攻击 – 其他任何事情都是由SSL自己完成的。 客户端身份validation是用户名和密码scheme的替代scheme。

Interesting Posts