security - 什么使 SSL 安全?

标签 security ssl https

我一直在 Internet 上阅读一些有关 SSL 工作原理的网站,但我不明白它究竟是如何确保安全的。可能是因为我不完全理解它是如何工作的。

让我从 SSL 的核心思想开始。它用于加密 HTTP 连接,但客户端和服务器要使用加密数据进行通信,肯定需要共享加密 key 。如果有人在窃听您的连接,他们难道不能捕获这个 key 并在解密数据的同时继续收听吗?如果我们谈论的是长期连接,我可以想象这种技术会起作用,但 HTTP 请求通常会在半秒内完成。

让我们假设这是以某种方式处理的。 SSL 的另一个用途是验证服务器是否与它所说的完全一致。是什么阻止流氓服务器伪造由根证书提供商签名的证书?在我读过的所有描述中,浏览器实际上都没有联系这些机构之一来验证证书。假设证书由根证书颁发机构使用私钥加密,浏览器如何在不知道解密 key 的情况下验证此证书中的数据?还是解密 key 与加密 key 不同?

我能想到的解决这些问题的一种方法是,证书和 key 只发送一次,并与域和 IP 地址一起存储在您的浏览器中。

感谢您提前解释。

最佳答案

首先,关于公钥密码学的一些基本概念:

  • 这依赖于一对 key 。一个是公钥(可以分发);另一个是私钥,旨在保密。
  • 您可以使用公钥加密数据,私钥可以解密/解密
  • 您可以使用私钥签署数据,并且可以使用公钥验证此签名。

为确保您与正确的实体进行通信,您需要将身份绑定(bind)到 key 对。这就是证书的用武之地。公钥证书是包含主体身份(姓名)和主体公钥的签名文档。 例如,www.google.com 的证书包含其公钥和名称 www.google.com。它已使用证书颁发机构(在本例中为 Thawte)的私钥进行了签名。在 X.509 术语(用于 HTTPS 的证书的通用标准)中,CA 是证书的颁发者,它也在证书中加上它的名字,以及主题的名称、主题的公钥(和其他属性) .颁发者旨在验证他们为谁颁发证书的身份。

您不一定会看到浏览器从 CA 获取信息的原因是许多商业(或政府)CA 证书与您的浏览器或操作系统捆绑在一起。默认情况下,您信任他们。这可以被视为“信仰的飞跃”,但任何信任机制都需要这样的起点。

您可能想阅读有关 TLS handshake 的更多信息,但简而言之:

  • 客户端通过查看服务器的证书获取服务器的公钥。
  • 客户端使用这个公钥加密一个 secret 并将它发送到服务器。这方面的细节取决于密码套件(可能基于 Diffie-Hellman),但其结果应该是共享加密 key 列表(使用对称加密,而不是公钥加密)。
  • 这些共享 key 只有客户端和服务器知道,用于加密/解密。

要使 SSL/TLS 安全,您至少需要 3 点:

  • 合适的密码套件和成功的握手。
  • 验证客户端是否信任服务器证书(通常通过 PKI model 中的已知 CA)。
  • 验证证书属于客户端打算联系的服务器 (hostname verification)。

(绝大多数 SSL/TLS(特别是 HTTPS)的使用都是这种情况,但也可以使用具有 TLS 的 X.509 证书以外的其他机制,例如 OpenPGP 证书或 Kerberos 密码套件。这据我所知不太常见。)

关于security - 什么使 SSL 安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185725/

相关文章:

Django auth-app 密码屏蔽 - 有什么方法可以关闭吗?

ssl - 使用 proxy_pass 会影响 letsencrypt 安装吗?

html - 如何通过 HTTPS 安全地提交表单?

javascript - swfobject 不适用于 Chrome 中的 https

php - Symfony 找不到 "GET/logout"的路由

java - 将参数传递给我的 login.jsp

macos - 使用 letsencrypt 更新证书后 SSL 不工作

silverlight - 在没有 ssl 的情况下从服务器加载 Silverlight 应用程序的图像

c# - 登录到使用 Live.com 身份验证的站点

security - SQL 注入(inject)或 Server.HTMLEncode 或两者兼而有之?经典 ASP