SSL如何真正起作用?

SSL如何工作?

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

将URL输入浏览器并从服务器获取页面时,信任/加密/认证过程如何启动?

HTTPS协议如何识别证书? 为什么不能在证书完成所有信任/加密/认证工作时使用证书?


注意:我非常急切地写下了我的原始答案,但从那以后,这已经变成一个相当受欢迎的问题/答案,所以我扩大了一点,并使其更加精确。

TLS功能

“SSL”是最常用来表示此协议的名称,但SSL特指在90年代中期由Netscape设计的专有协议。 “TLS”是基于SSL的IETF标准,因此我将在我的答案中使用TLS。 现在,几乎所有的网络安全连接都使用TLS,而不是SSL。

TLS有几项功能:

  • 加密您的应用程序层数据。 (就你而言,应用层协议是HTTP。)
  • 向客户端验证服务器。
  • 验证客户端到服务器。
  • #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的竞争对手)签署,也没关系。 我的证书仍然可以使用威瑞信的妥协签名密钥伪造。

    这不仅仅是理论上的。 它发生在野外。 DigiNotar遭到了着名的黑客攻击,随后破产。 科摩多也遭到黑客攻击,但无可否理,他们至今仍在商业活动中。

    即使CA没有直接受到危害,这个系统还存在其他威胁。 例如,政府使用法律强制迫使CA签署伪造证书。 您的雇主可以在您的员工电脑上安装自己的CA证书。 在这些不同情况下,您希望“安全”的流量对控制该证书的组织而言实际上是完全可见/可修改的。

    已经提出了一些替代方案,包括Convergence,TACK和DANE。

    尾注

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

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

    [3]可推测,CA在签署证书之前实际验证您的身份。 如果他们没有这样做,那么我可以为google.com创建一个证书,并要求CA签名。 凭借这一证明,我可以将任何“安全”的连接与中国联系起来。 因此,验证步骤是CA操作中非常重要的一个因素。 不幸的是,这个验证过程在世界各地的数百个CA中有多严格并不是很清楚。

    [4]请参阅Mozilla的可信CA列表。


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

    为什么需要?

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

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

  • 浏览器尝试连接到https://payment.com。
  • payment.com服务器向浏览器发送证书。 此证书包含payment.com服务器的公钥,以及一些证明此公钥实际属于payment.com的证据。
  • 浏览器验证证书以确认其拥有适用于payment.com的正确公钥。
  • 浏览器选择一个随机的新对称密钥K用于连接到payment.com服务器。 它使用payment.com公钥对K进行加密。
  • payment.com使用其私钥解密K. 现在浏览器和付款服务器都知道K,但其他人都不知道。
  • 任何时候浏览器都想将某些内容发送给payment.com,它会在K下加密它; payment.com服务器在收到后将其解密。 任何时候,payment.com服务器都希望将某些内容发送给您的浏览器,它会在K下进行加密。
  • 这个流程可以用下面的图表来表示: 在这里输入图像描述


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

    SSL握手

    同样的小片段如下:

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

    链接地址: http://www.djcxy.com/p/21813.html

    上一篇: How does SSL really work?

    下一篇: SSL Security man