首页 文章

了解SSL

提问于
浏览
45

我有三个关于SSL的问题我还不完全理解 .

  • 如果我正确使用,服务器 A 会向某个CA提交请求 . 然后,它(在验证之后)接收由公钥标识组成的数字证书,使用CA的私钥来标识该信息 .

稍后,客户端 B 想要与 A 打开SSL通信,因此 A 发送 B 其数字证书 .

我的问题是不能 B 只是拿这个证书,因此窃取身份 A - 这将允许他们认证为 AC ,例如 . 我知道 C 将使用CA的公钥解密证书,然后它将加密其对称密钥,该密钥只能由真实 A 解密 .

但是,如果 B 实际上可以窃取 A 的身份,我也看不到身份验证在哪里发挥作用 . 除非我遗漏了什么 .

  • 第二个问题:如果CA的一部分已经加密,为什么要在证书上使用散列?这是不是意味着没有人可以乱用数字证书(很有可能)?

  • 如果我是stackoverflow并且我有3台服务器做同样的事情 - 允许客户端访问,读取,识别等 - 我是否必须为3台服务器中的每台服务器提供不同的数字证书 .

非常感谢你 .

6 回答

  • 1

    SSL身份的特征由四部分组成:

    • 私钥,不与任何人共享 .

    • 公钥,您可以与任何人共享 .

    私钥和公钥形成匹配对:用一个加密的任何东西都可以用另一个解密,但是你不能用私钥解密用公钥加密的东西,反之亦然 . 这是真正的数学魔法 .

    • 附加到公钥的元数据,说明它正在谈论的人 . 对于服务器密钥,这将标识正在保护的服务的DNS名称(以及其他内容) . 此处的其他数据包括预期用途(主要用于限制持有证书的人可以造成的损害数量)和有效期限(限制被盗证书的使用时间) .

    • 关于公钥和元数据组合的数字签名,以便它们不会被混淆,以便其他人可以知道信任元数据的程度 . 有多种方法可以处理签名者:

    • 使用私钥签名(来自上文第1部分);自签名证书 . 任何人都可以做到这一点,但它并没有传达太多的信任(正因为任何人都可以这样做) .

    • 通过签署证书,让一群相互信任的人为您辩护;信任网(所谓的信任关系是因为信任关系是可传递的,并且通常是对称的,因为人们互相签署证书) .

    • 让受信任的第三方进行签名;证书颁发机构(CA) . CA的身份由信任链中的另一个更高级别的CA保证回到“每个人”信任的某个根权限(即,可以在部署时更新's a list built into your SSL library, which it') .

    上述三种类型的权限之间没有基本的技术差异,但人们对它们的信任性质是极其可变的 . 这个原因的细节确实需要很长的答案!

    项目2-4包括数字证书 .

    当客户端B与服务器A启动SSL协议时,服务器's digital certificate is communicated to B as part of the protocol. A'的私钥不会被发送,但由于B可以使用数字证书中的公钥成功解密另一端发送的消息,B可以知道A有私钥匹配 . 然后,B可以查看证书中的元数据,并看到另一端声称是A,并且可以检查签名以查看信任该断言的程度;如果元数据由B信任(直接或间接)信任的权威机构签署,则B可以信任另一端有A 's SSL identity. If that identity is the one that they were expecting (i.e., they wanted to talk to A: in practice, this is done by comparing the DNS name in the certificate with the name that they used when looking up the server address) then they can know that they have a secured communications channel: they'好 .

    B不能用这些信息冒充A:B不会获得A的私钥,因此在验证的第一阶段它们都会崩溃 . 为了让某些第三方冒充B,他们需要(至少)两个:

    • 私钥 . 身份的所有者需要注意阻止这种情况发生,但最终掌握在他们手中 .

    • 造成虚假的可信任机构声明 . 这里偶尔有一些弱点 - 自签名的权威从来都不是非常值得信赖的,信任网会遇到问题,因为信任是一种传递性处理的尴尬,有些CA完全不择手段而其他人也倾向于不排除渣滓 - 但主要是这种方法运作得相当好,因为大多数政党都希望不会因为经济原因而导致问题 .

    • 一种毒化DNS的方法,以便目标认为不同的服务器实际上是被模拟的服务器 . 没有DNSsec,遗憾的是这有点容易,但这个特殊问题正在减少 .

    至于你的其他问题......

    如果CA的一部分已经加密,为什么要在证书上使用哈希?这是不是意味着没有人可以乱用数字证书(很有可能)?

    虽然密钥相当长,但证书更长(一方面,它们包括签名者公钥,通常与签名密钥的长度相同) . Hashing是用于签署文档的通用算法的一部分,因为没有人希望仅限于签署非常短的内容 . 鉴于该算法是必需的,因此将其用于此目的是有意义的 .

    如果我是stackoverflow并且我有3台服务器做同样的事情 - 允许客户端访问,读取,识别等 - 我是否必须为3台服务器中的每台服务器提供不同的数字证书 .

    如果你有几个服务器提供相同的DNS名称(那么's many ways to do this, one of the simplest being round-robin DNS serving) you can put the same identity on each of them. This slightly reduces security, but only very slightly; it'仍然只有一个服务恰好由多个服务器实现 . 理论上你可以给每个服务器一个不同的身份(虽然名称相同)但我可以't think of any good reason for actually doing it; it'更多可能比其他人更担心 .

    另请注意,可以同时拥有多个服务名称的证书 . 有两种机制可以执行此操作(在证书中添加备用名称或在证书名称中使用通配符),但CA通常会为使用它们签名证书收取相当多的费用 .

  • 0

    我的问题是不能“B”只拿这个证书,从而窃取“A”的身份 - 这将允许他们认证为“A”到“C”

    还有一个未传输的证书的私有部分(私钥) . Without the private key, B cannot authenticate as A. 同样,我知道你的StackOverflow用户名,但这不能让我像你一样登录 .

    如果CA的一部分已经加密,为什么要在证书上使用哈希?

    通过这种方式,任何人都可以验证它是产生哈希的CA,而不是其他人 . 这证明证书是 produced by the CA, and thus, the "validation etc." was performed.

    如果我是stackoverflow并且我有3台服务器做同样的事情 - 允许客户端访问,读取,识别等 - 我是否必须为3台服务器中的每台服务器提供不同的数字证书 .

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

  • 0

    第一个问题:您对从CA返回的内容是正确的,但在向CA提交请求之前,您缺少部分内容 . 您需要(1)证书请求,以及(2)相应的私钥 . 您不会将私钥作为请求的一部分发送;你把它保密在你的服务器上 . 您签名的证书包含相应公钥的副本 . 在任何客户认为B "owns"证书之前,B必须通过使用密钥来证明它,以便签署客户发送的质询 . 没有A的私钥,B不能这样做 .

    第二个问题:典型的公钥加密操作在固定大小的数据(例如,2048位)上,并且在某种程度上计算上很昂贵 . 因此,为了对任意大小的文档进行数字签名,将文档分解为固定大小的块,然后使用私钥加密 .

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

  • 68

    一般来说,是的,如果证书文件被盗,没有什么能阻止某人在他们的服务器上安装它并突然假设被盗网站的身份 . 但是,除非窃贼接管原始站点的DNS设置,否则对站点URL的任何请求仍将转到原始服务器,窃贼的服务器将保留闲 .

    这相当于 Build 了南极洲自由女神像的精确复制品,期望偷走纽约的旅游收入 . 除非你开始黑客攻击每一本旅游指南和历史教科书以取代南极洲的“纽约”,否则每个人都会去纽约看真正的雕像,而小偷只会有一个非常大的,绿色的,完全无声的冰柱 .

    但是,当您从CA获得证书时,证书受密码保护,不能简单地安装在Web服务器中 . 有些地方会删除密码,因此网络服务器可以自行重启而无需干预 . 但是安全站点会保留密码,这意味着任何服务器重新启动都会终止站点,直到有人进入管理控制台并输入PW来解密证书 .

  • 6

    我也有一些答案 .

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

    • C将验证B的IP地址并发现它不属于C.它将中止SSL连接 . 当然,即使C发送加密消息,只有Real A才能解密它 .

    Q2)证书通常使用通用格式X.509以纯文本表示 . 任何人都可以阅读所有条目 . 散列过程用于对文档进行数字签名 . 数字签名证书使最终用户验证证书在创建后未被任何人更改 . 使用发行者的私钥对内容进行散列和加密是为了创建数字签名 .

  • 1

    问题编号1

    不能B只拿这个证书[...],这将允许他们作为A到C进行身份验证

    这个diagram更大的diagram处理这个问题 .

    主要是:如果您只有公钥,那么您无法与任何客户 Build SSL连接,因为您需要与他们交换密钥,并且必须使用您的公钥加密密钥,这就是客户要求的原因这是第一次 . 客户端应该使用您的公钥加密共享密钥,您应该使用您的私钥解密它 . 由于您没有私钥,因此无法解密秘密交换密钥,因此您无法与任何客户端 Build 任何SSL通信 .

    问题N°2

    如果CA的一部分已经加密,为什么要在证书上使用哈希?

    original diagram中,"what's a signature ?"也回答了这个问题 . 基本上,我们已被篡改(数据完整性),没有人改变其中的任何内容,而您所看到的实际上是由CA提供的内容 . 该图显示了如何使这成为可能 .

    问题N°3

    如果我是stackoverflow并且我有3台服务器,我必须为3台服务器中的每台服务器提供不同的数字证书 .

    情况并非总是如此 . 考虑所有三个服务器位于同一域的情况,然后您只需要一个证书,如果每个证书都在自己的子域中,则可以在所有这些域上安装一个通配符证书 .

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

相关问题