Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSL究竟是如何工作的?_Ssl_Ssl Certificate - Fatal编程技术网

SSL究竟是如何工作的?

SSL究竟是如何工作的?,ssl,ssl-certificate,Ssl,Ssl Certificate,SSL是如何工作的 客户端(或浏览器?)和服务器(或web服务器?)上的证书安装在哪里 在浏览器中输入URL并从服务器获取页面时,信任/加密/身份验证过程如何启动 HTTPS协议如何识别证书?当所有信任/加密/身份验证工作都由证书完成时,为什么HTTP不能与证书一起工作 注意:我很匆忙地写下了我的原始答案,但从那时起,这已经变成了一个相当流行的问题/答案,所以我对它进行了一些扩展,使其更加精确 TLS能力 “SSL”是最常用来指代此协议的名称,但SSL特别指由Netscape在90年代中期设计的

SSL是如何工作的

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

在浏览器中输入URL并从服务器获取页面时,信任/加密/身份验证过程如何启动

HTTPS协议如何识别证书?当所有信任/加密/身份验证工作都由证书完成时,为什么HTTP不能与证书一起工作

注意:我很匆忙地写下了我的原始答案,但从那时起,这已经变成了一个相当流行的问题/答案,所以我对它进行了一些扩展,使其更加精确

TLS能力 “SSL”是最常用来指代此协议的名称,但SSL特别指由Netscape在90年代中期设计的专有协议。“TLS”是基于SSL的IETF标准,因此我将在回答中使用TLS。如今,几乎所有web上的安全连接都使用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自签名证书。”

    有了这种明确的信任,现在我可以验证整个证书链了。无论链中有多少证书,我都可以验证每个签名,直到根。当我到达根目录时,我可以检查根目录证书是否是第1个