了解SSL

我有三个有关SSL的问题,我不完全明白。

  1. 如果我正确地得到它,服务器A提交一个请求到某个CA. 然后,它接收(在validation等之后)由公钥+身份+使用CA的私钥对这个信息的描述组成的数字证书。

    之后,客户B想要打开与A的SSL通信,所以AB发送其数字证书。

    我的问题是B不能拿这个证书,从而窃取身份A – 例如,他们可以authentication为AC 我知道C将用CA的公开密钥解密证书,然后encryption它只能被真实A解密的对称密钥。

    但是,如果B实际上窃取了A的身份,我不知道authentication在哪里发挥作用。 除非我失去了一些东西。

  2. 第二个问题:如果证书的一部分已经被CAencryption了,为什么要在证书上使用散列呢? 这是否意味着无论如何,没有人可以乱用数字证书?

  3. 如果我是stackoverflow,我有3台服务器做同样的事情 – 允许客户端访问,读取,识别等 – 我必须有3个服务器的每个不同的数字证书。

非常感谢你。

SSL身份的特点有四个部分:

  1. 私人密钥,不与任何人共享。
  2. 一个公钥,你可以与任何人分享。

    私钥和公钥形成一对匹配:任何你用一个进行encryption的东西都可以与另一个进行解密,但是不能用私钥解密用公钥encryption的东西,反之亦然。 这是真正的math魔法。

  3. 元数据附加到公开密钥,说明他正在谈论的人。 对于服务器密钥,这将标识正在保护的服务的DNS名称(等等)。 此处的其他数据包括预期用途(主要用于限制证书被窃者可以执行的损害数量)和失效date(限制被盗证书的使用期限)等内容。
  4. 公钥和元数据相结合的数字签名 ,不能混淆,因此别人可以知道信任元数据有多less。 处理签名的人有多种方法:

    • (从上面的第1部分)签署私钥。 自签名证书。 任何人都可以做到这一点,但不能传达太多的信任(正是因为任何人都可以做到这一点)。
    • 让一群相互信任的人通过签署证书为您担保; 一个信任的networking(所谓的,因为信任关系是传递性的,并通常是对称的,因为人们彼此签署证书)。
    • 获得可信的第三方签名; 证书颁发机构(CA)。 CA的身份由信任链中的另一个更高级别的CA保证,返回到“所有人”信任的某个根权限(即,在您的SSL库中内置了一个列表,可以在部署时更新)。

    上述三种权力机构之间并没有根本的技术差异,但信任者的本质是非常不同的。 这个细节为什么需要很长的答案!

项目2-4是由数字证书组成的。

当客户端B与服务器A启动SSL协议时,服务器的数字证书作为协议的一部分传送给B. A的私钥没有被发送,但是由于B可以用数字证书中的公钥成功解密另一端发送的消息,所以B可以知道A具有匹配的私钥。 B然后可以查看证书中的元数据,并看到另一端声称是A,并可以检查签名,看看有多less信任该断言; 如果元数据由B信任的权威(直接或间接)签署,则B可以相信另一端具有A的SSL身份。 如果这个身份是他们期望的身份(即他们想要和A进行交谈,实际上这是通过将证书中的DNS名称与查找服务器地址时使用的名称进行比较来完成的),那么他们可以知道他们有一个安全的沟通渠道:他们很好走。

B不能用这样的信息来模拟A:B不能得到A的私钥,所以在validation的第一阶段它将全部崩溃。 为了让第三方冒充B,他们需要(至less)两个:

  • 私钥 。 身份的所有者需要小心,以防止这种情况发生,但最终还是在他们手中。
  • 一个可信的当局做出错误的陈述 。 这里偶尔会有一些弱点 – 一个自签名的权威永远不值得信赖,一个信任networking会遇到问题,因为信任是一个尴尬的事情来处理传递,有些CA是彻头彻尾的不择手段,而另一些则倾向于不排除败类 – 但主要这个工作相当好,因为大多数政党都热衷于不会造成问题,往往出于经济原因。
  • 一种毒化DNS的方法 ,使目标相信一个不同的服务器真的是被模仿的。 没有DNSsec,不幸的是,这个过程有些简单,但是这个特殊的问题正在减less。

至于你的其他问题…

为什么在证书上使用散列,如果它的一部分已经由CAencryption? 这是否意味着无论如何,没有人可以乱用数字证书?

虽然密钥相当长,但证书更长(一方面,无论如何,它们都包含签名者的公钥,这通常与被签名的密钥长度相同)。 哈希是签署文件的一般algorithm的一部分,因为没有人想限制只签署非常短的东西。 鉴于algorithm是必需的,为此目的使用它是有意义的。

如果我是stackoverflow,我有3个服务器做同样的事情 – 允许客户端访问,阅读,识别等 – 我必须有3个服务器的每个不同的数字证书。

如果您有多个服务器提供相同的DNS名称(有很多方法可以做到这一点,最简单的方法之一是循环DNS服务),您可以在每个服务器上放置相同的标识。 这稍微降低了安全性,但只是非常轻微; 它仍然是一个恰好由多个服务器实现的服务 。 理论上你可以给每个人一个不同的身份(虽然名字相同),但我想不出有什么好的理由去实际去做。 比替代scheme更容易让人担心。

另外请注意,一次可以有一个以上的服务名称的证书。 有两种机制可以做到这一点(在证书中添加备用名称或在证书名称中使用通配符),但CA对签署证书往往收取相当多的费用。

我的问题是“B”不能拿这个证书,因此窃取了“A”的身份 – 这将使他们authentication为“A”到“C”

还有一个私人部分的证书没有得到传输(私钥)。 没有私钥,B不能authentication为A.同样,我知道你的StackOverflow用户名,但是不会让我像你一样login。

为什么在证书上使用散列,如果它的一部分已经由CAencryption?

通过这样做,任何人都可以validation是由谁来生成哈希,而不是其他人。 这certificate证书是由CA生成的,因此“validation等” 被执行了。

如果我是stackoverflow,我有3个服务器做同样的事情 – 允许客户端访问,阅读,识别等 – 我必须有3个服务器的每个不同的数字证书。

这取决于具体情况,但每个人可能都有相同的证书。

第一个问题:您从CA处获得的回复是正确的,但是在将请求提交给CA之前,您缺less了所需的部分内容。 您需要(1)证书请求,和(2)相应的私钥 。 您不要将私钥作为请求的一部分发送; 你把它保密在你的服务器上。 您的签名证书包含相应公钥的副本。 在任何客户认为B拥有该证书之前,B必须使用该密钥来certificate该密钥以签署客户发送的挑战。 B不能没有A的私人密钥。

第二个问题:典型的公钥密码术是以固定大小的数据(例如2048位)进行操作,并且在计算上有些昂贵。 因此,为了对任意大小的文档进行数字签名,将文档散列为一个固定大小的块,然后用私钥对其进行encryption。

第三个问题:您可以在多个服务器上使用单个证书; 你只需要在所有的服务器上相应的私钥。 (当然,用于访问服务器的DNS名称必须与证书中的CN匹配,否则客户端可能会出现问题,但是将一个DNS名称引用到多个服务器是一种常见且简单的负载平衡方法。

一般来说,是的,如果证书文件被盗,没有任何东西会阻止某人将其安装在他们的服务器上,并突然承担被盗的网站身份。 但是,除非小偷接pipe了对原始站点的DNS设置的控制权,否则对该站点URL的任何请求都将仍然到达原始服务器,并且小偷的服务器将保持空闲状态。

这相当于在南极洲build立一个自由女神像,以期偷走纽约的旅游收入。 除非你开始用黑客入侵每一本旅游指南书和历史教科书来取代“纽约”,否则每个人都会去纽约看真正的雕像,小偷只会有一个非常大的,绿色的,完整的空闲冰柱。

但是,当您从CA获得证书时,证书受密码保护,不能简单地安装在Web服务器中。 有些地方会删除密码,以便networking服务器可以重新启动而不用干预。 但是一个安全的站点会保留密码,这意味着任何服务器重新启动都将终止该站点,直到有人进入pipe理控制台并input密码来解密证书。

我也有一些答案。

Q1)如果B窃取A的证书,并尝试冒充A到C.

  • C会validationB的IP地址,发现它不属于C,然后中止SSL连接。 当然,即使C发送了一个encryption的消息,只有Real A才能解密它。

Q2)证书通常以普通格式X.509以纯文本格式表示。 所有条目都可以被任何人阅读。 散列过程用于对文档进行数字签名。 数字签名证书使得最终用户validation该证书在创build后没有被任何人改变。 使用发行者的私钥对内容进行散列和encryption以创build数字签名。

问题N°1

B不能只拿这个证书,让他们authentication为A至C

这个较大图的这一部分处理这个问题。

主要是:如果你只有公钥,那么你不能build立与任何客户端的SSL连接,因为你需要与他们交换一个密钥,这个密钥必须使用你的公钥进行encryption,这就是为什么客户要求它在第一次。 客户端应该使用公钥对共享密钥进行encryption,并且应该使用私钥对其进行解密。 由于您没有私钥,因此无法解密密钥交换密钥,因此无法与任何客户端build立任何SSL通信。

问题N°2

为什么在证书上使用散列,如果它的一部分已经由CAencryption?

这也是在原始图中由“什么是签名?”这个问题回答的。 基本上,我们对整个证书进行哈希处理,以确保它没有被篡改(数据完整性),没有人改变任何内容,而且你看到的是真正由CA提供的。 图表显示了如何使得这种可能性。

问题N°3

如果我是stackoverflow,我有3个服务器,我必须有3个服务器的每个不同的数字证书。

这并不总是如此。 考虑三台服务器都在同一个域中的情况,那么你只需要一个证书,如果每个服务器都在自己的子域上,那么你可以在其上安装一个通配符证书。

相反,如果您有一台承载多个域的服务器,则您将拥有一个多域SSL证书。