SSL真正如何运作?


143

SSL如何工作?

客户端(或浏览器?)和服务器(或Web服务器?)上安装的证书在哪里?

当您在浏览器中输入URL并从服务器获取页面时,信任/加密/认证过程如何开始?

HTTPS协议如何识别证书?当所有的信任/加密/认证工作都是证书时,为什么HTTP无法与证书一起使用?


24
我认为这是一个合理的问题-了解SSL如何工作是步骤1,正确实施SSL是步骤2至步骤无限。
synthesizerpatel


4
这是一个以字节
Rob Church

5
@StingyJack在这里不要成为政策纳粹。人们来寻求帮助。不要否认他们的所有帮助,因为您发现问题与规则不完全匹配。
Koray Tugay 2013年

1
@KorayTugay-没有人否认提供帮助。这确实属于安全性或Sysadmin更好的针对性,但是OP通常可以通过添加一些编程上下文而不是发布一般的IT问题而在此论坛中受益。当没有与特定编程问题相关的问题时,有多少人会关闭问题?可能太多,因此我勉强推荐了OP以建立这种联系。
StingyJack

Answers:


144

注意:我非常匆忙地写了原始答案,但是从那时起,它变成了一个相当受欢迎的问题/答案,因此我对其进行了扩展并使其更加精确。

TLS功能

“ SSL”是最常用于指代该协议的名称,但SSL特别指的是Netscape在90年代中期设计的专有协议。“ TLS”是基于SSL的IETF标准,因此我将在答案中使用TLS。这些天来,很可能您的网络上几乎所有安全连接实际上都使用TLS,而不是SSL。

TLS具有以下功能:

  1. 加密您的应用程序层数据。(在您的情况下,应用程序层协议为HTTP。)
  2. 向客户端验证服务器。
  3. 向服务器验证客户端。

#1和#2很常见。#3不太常见。您似乎专注于#2,因此我将解释这一部分。

认证方式

服务器使用证书对客户端进行身份验证。证书是包含有关网站信息的数据[1]的斑点:

  • 域名
  • 公钥
  • 拥有它的公司
  • 何时发行
  • 到期时
  • 谁发行的
  • 等等。

您可以通过使用证书中包含的公钥来加密只能由相应私钥解密的消息来实现机密性(上述#1),该私钥应安全地存储在该服务器上。[2] 我们将此密钥对称为KP1,这样以后就不会感到困惑。您还可以验证证书上的域名是否与您访问的站点相匹配(上面的#2)。

但是,如果对手可以修改发送到服务器或从服务器发送的数据包,又如果该对手修改了向您提供的证书并插入了自己的公钥或更改了其他重要细节,该怎么办?如果发生这种情况,对手可以拦截和修改您认为已安全加密的任何消息。

为了防止这种攻击,证书由其他人的私钥加密签名,这样签名可以被拥有相应公钥的任何人验证。让我们将此密钥对称为KP2,以明确它们与服务器使用的密钥不同。

证书颁发机构

那么谁创造了KP2?谁签署了证书?

稍微简化一点,证书颁发机构创建KP2,然后他们出售使用私钥为其他组织签名证书的服务。例如,我创建了一个证书,并向Verisign这样的公司付款,用他们的私钥对其进行签名。[3] 由于除了Verisign之外没有其他人可以访问此私钥,因此我们谁也不能伪造此签名。

为了验证该签名,我个人将如何使用KP2中的公钥?

好了,我们已经看到证书可以持有公钥,并且计算机科学家喜欢递归,那么为什么不将KP2公钥放入证书并以这种方式分发呢?起初听起来有些疯狂,但实际上这就是它的工作原理。继续使用Verisign示例,Verisign生成一个证书,其中包括有关他们是谁,允许他们签名的事物类型(其他证书)以及它们的公钥的信息。

现在,如果我拥有该Verisign证书的副本,则可以使用该副本来验证要访问的网站的服务器证书上的签名。容易吧?!

好吧,不是那么快。我必须从某处获得Verisign证书。如果有人欺骗了Verisign证书并在其中放置了自己的公钥怎么办?然后他们可以在服务器证书上伪造签名,然后我们就回到了开始的位置:中间人攻击。

证书链

继续进行递归思考,我们当然可以引入第三证书和第三密钥对(KP3),并使用它们来对Verisign证书进行签名。我们将其称为证书链:该链中的每个证书都用于验证下一个证书。希望您已经可以看到,这种递归方法一直都是乌龟/证书。它在哪里停下来?

由于我们不能创建无限数量的证书,因此证书链显然必须停在某处,这可以通过在自签名链中包含一个证书来完成。

当您从头部爆炸中捡起脑部物质时,我会稍等片刻。自签名?!

是的,在证书链的末尾(又名“根”),将有一个证书使用其自己的密钥对进行签名。这样可以消除无限递归问题,但不能解决身份验证问题。任何人都可以创建一个在其上写有任何内容的自签名证书,就像我可以创建一个虚假的普林斯顿大学文凭一样,该证书说我在政治,理论物理学方面都学过三门专业,然后应用对接,然后在底部签名了自己的名字。

解决此问题的方法(有点令人兴奋)只是选择您明确信任的一组自签名证书。例如,我可能会说:“我信任此Verisign自签名证书”。

有了明确的信任,现在我可以验证整个证书链。无论链中有多少证书,我都可以一直验证每个签名直到根。当我到达根目录时,可以检查该根证书是否是我明确信任的证书。如果是这样,那么我可以信任整个链条。

授予的信任

TLS中的身份验证使用授予信任的系统。如果我想雇用汽车修理工,我可能不相信我发现的任何随机修理工。但是也许我的朋友担保某个机械师。因为我信任我的朋友,所以我可以信任那个机械师。

当您购买计算机或下载浏览器时,计算机附带它明确信任的几百个根证书。[4] 拥有并运营这些证书的公司可以通过签署其证书将信任授予其他组织。

这远非一个完美的系统。有时,CA可能会错误地颁发证书。在这种情况下,可能需要吊销证书。吊销是棘手的,因为颁发的证书将始终是密码正确的;必须使用带外协议才能确定哪些先前有效的证书已被吊销。实际上,其中一些协议不是很安全,许多浏览器也不会对其进行检查。

有时,整个CA都受到威胁。例如,如果您要闯入Verisign并窃取其根签名密钥,那么您可以欺骗世界上任何证书。请注意,这不仅会影响Verisign客户:即使我的证书是由Thawte(Verisign的竞争对手)签署的,也没关系。我的证书仍可以使用Verisign的受感染签名密钥来伪造。

这不只是理论上的。它发生在野外。DigiNotar被黑客入侵,随后破产。Comodo也遭到了黑客攻击,但直到今天,他们仍在经营。

即使没有直接破坏CA,该系统中也存在其他威胁。例如,政府使用法律强制手段强迫CA对伪造的证书进行签名。您的雇主可以在您的员工计算机上安装自己的CA证书。在这些各种情况下,您期望“安全”的流量实际上对于控制该证书的组织是完全可见/可修改的。

建议了一些替代方案,包括ConvergenceTACKDANE

尾注

[1] TLS证书数据是根据X.509标准格式化的。X.509基于ASN.1(“抽象语法符号#1”),这意味着它不是二进制数据格式。因此,必须将X.509 编码为二进制格式。DER和PEM是我所知道的两种最常见的编码。

[2]实际上,协议实际上会切换到对称密码,但这是一个细节,与您的问题无关。

[3]大概是,CA在签署证书之前实际上会验证您的身份。如果他们没有这样做,那么我可以为google.com创建证书,然后要求CA对其进行签名。有了该证书,我可以将与google.com的任何“安全”连接置于中间位置。因此,验证步骤是CA运作中非常重要的因素。不幸的是,目前尚不清楚世界各地数百个CA的验证过程多么严格。

[4]请参阅Mozilla的受信任CA列表


什么是私钥?
Koray Tugay

您忘了提及公钥是发送到网站的证书文件的一部分,该证书文件首先解密您加密的数据。
mamdouh alramadan 2014年

谢谢@mamdouhalramadan。我已经提到了这一点。
Mark E. Haase 2014年

2
@mamdouhalramadan“将公钥发送到网站以解密数据”。如何使用公钥解密数据?
泰迪

@teddy你是正确的。不行 公钥仅用于身份验证。这里声称密钥对也用于加密和解密的说法是不正确的。为此使用了安全协商的会话密钥。
罗恩侯爵

53

HTTPS是HTTPSSL(安全套接字层)的组合,用于在客户端(浏览器)和Web服务器(此处托管应用程序)之间提供加密的通信。

为什么需要它?

HTTPS加密通过网络从浏览器传输到服务器的数据。因此,没有人可以在传输过程中嗅探数据。

浏览器和Web服务器之间如何建立HTTPS连接?

  1. 浏览器尝试连接到https://payment.com
  2. payment.com服务器将证书发送到浏览器。该证书包括payment.com服务器的公钥,以及一些证明该公钥实际上属于payment.com的证据。
  3. 浏览器会验证证书,以确认它具有用于payment.com的正确公钥。
  4. 浏览器选择一个随机的新对称密钥K来连接到payment.com服务器。它使用payment.com公钥加密K。
  5. payment.com使用其私钥解密K。现在,浏览器和支付服务器都知道K,但是没有人知道。
  6. 任何时候浏览器想要发送一些东西到Payment.com时,它都会在K下对其进行加密;Payment.com服务器在收到后将其解密。任何时候Payment.com服务器想要向您的浏览器发送内容时,它都会在K下对其进行加密。

下图可以表示此流程: 在此处输入图片说明


1
关于在服务器上加密和发送会话密钥以及对其进行解密的部分已经完成,而且很垃圾。会话密钥根本不会传输:它是通过安全密钥协商算法建立的。在发布这样的废话之前,请检查您的事实。RFC2246。–
罗恩侯爵(Marquis of Lorne)

为什么浏览器在将数据发布到服务器时不使用服务器的公共密钥来加密数据,而不是在步骤4中创建随机的新对称密钥K?
KevinBui

1
@KevinBui因为从服务器发送响应将要求客户端具有密钥对,并且因为非对称加密非常慢。
罗恩侯爵,

3

我写了一篇博客文章,简要讨论了该过程。请随时查看。

SSL握手

相同的一个小片段如下:

“客户端通过HTTPS向服务器发出请求。服务器发送其SSL证书+公钥的副本。在使用本地受信任的CA存储验证了服务器的身份之后,客户端会生成一个秘密会话密钥,并使用服务器的公钥对其进行加密服务器使用其私钥解密秘密会话密钥,并将确认发送给客户端。安全通道已建立。”


“在使用本地信任的CA存储验证服务器的身份之后”-严格地说,这不是正确的。我可以使用自签名证书,HTTPS可以工作-我可以与服务器建立安全的HTTPS连接。仅当我要确保我与正确的服务器通信时,才会提供受信任的证书。
Teddy

关于在服务器上加密和发送会话密钥以及对其进行解密的部分已经完成,而且很垃圾。会话密钥根本不会传输:它是通过安全密钥协商算法建立的。在发布这样的废话之前,请检查您的事实。RFC2246。–
罗恩侯爵(Marquis of Lorne)

@泰迪这是不正确的。证书信任检查是SSL的必需部分。它可以绕开,但通常是有效的:没有一种或另一种特殊措施,自签名证书将无法工作。
罗恩侯爵

2

Mehaase已经详细解释了它。我将在此系列中加2美分。我有许多关于SSL握手和证书的博文。尽管大多数讨论都围绕IIS Web服务器进行,​​但是该帖子通常还是与SSL / TLS握手相关。以下是供您参考:

不要将CERTIFICATESSSL视为一个主题。将它们视为2个不同的主题,然后尝试查看它们的共同作用。这将帮助您回答问题。

通过证书存储在通信双方之间建立信任

SSL / TLS通信仅在信任的基础上工作。互联网上的每台计算机(客户端/服务器)都有其维护的根CA和中级CA的列表。这些定期更新。在SSL握手期间,此操作将用作建立信任的参考。例如,在SSL握手期间,当客户端向服务器提供证书时。服务器将尝试检查颁发证书的CA是否在其CA列表中。当无法执行此操作时,它声明无法执行证书链验证。(这是答案的一部分。它也着眼于友邦保险客户端也对在服务器Hello中收到的服务器证书进行类似的验证。在Windows上,您可以通过PowerShell查看客户端和服务器的证书存储。从PowerShell控制台执行以下操作。

PS证书:> ls位置:CurrentUser商店名称:{TrustedPublisher,ClientAuthIssuer,根,UserDS ...}

位置:LocalMachine商店名称:{TrustedPublisher,ClientAuthIssuer,远程桌面,根...}

Firefox和Opera等浏览器不依赖底层操作系统进行证书管理。他们维护自己的独立证书存储。

SSL握手使用对称和公共密钥密码术。服务器身份验证默认情况下发生。客户端身份验证是可选的,取决于服务器端点是否配置为对客户端进行身份验证。请参阅我的博客文章,因为我已经对此进行了详细解释。

最后对于这个问题

HTTPS协议如何识别证书?当所有的信任/加密/认证工作都是证书时,为什么HTTP无法与证书一起使用?

证书只是一个文件,其格式由X.509标准定义。它是证明通讯方身份的电子文件。 HTTPS = HTTP + SSL是一个协议,该协议定义了两个方如何相互通信的准则。

更多信息

  • 为了了解证书,您将必须了解什么是证书,还必须阅读有关证书管理的信息。这些很重要。
  • 了解这一点后,请继续进行TLS / SSL握手。您可以为此参考RFC。但是它们是定义准则的基础。有包括我的博客文章详细解释了这一点。

如果完成了上述活动,那么您将对证书和SSL有了一定的了解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.