【问题标题】:CA public key vs. server public key: what should I use to establish an HTTPS connection?CA 公钥与服务器公钥:我应该使用什么来建立 HTTPS 连接?
【发布时间】:2012-12-17 02:48:26
【问题描述】:

我需要创建一个客户端库以通过 HTTPS 与单个服务(例如 google.com)通信。 我希望库附带验证服务所需的所有数据(证书或密钥)。

我很困惑这些数据应该是什么。它应该是签署 google.com 证书的证书颁发机构的公钥吗?还是应该是 google.com 的公钥?

在我见过的所有示例中,证书颁发机构的公钥都用于对连接进行身份验证。但这似乎没有必要。如果我的图书馆只与 google.com 对话,我是否可以通过安全通道(浏览器)获取并保存 google.com 公钥,然后直接使用此密钥建立经过身份验证的连接,而无需再次使用 CA 密钥?

【问题讨论】:

  • 这不是 SSL 的工作方式。您只需要一个受信任的根 CA,这样您就可以验证服务器发送的证书。
  • @SLaks 但我的理解是引入 CA 是为了允许对大量站点进行身份验证,而无需在客户端存储所有密钥(管理噩梦)。如果库与单个服务器通信并且拥有该服务器的公钥,是否还需要证书验证(如果证书是伪造的,公钥无论如何都不起作用)?
  • 你是对的;您可以存储单个公钥并要求服务器使用该密钥。但是,这使得无法替换密钥,这就是 PKI 和 CRL 存在的原因。如果私钥被泄露,你会怎么做?
  • @SLaks 这确实是一个问题,如果私钥被泄露,所有客户端都需要更新。但同样,如果 CA 密钥被泄露,或者服务器更改 CA,则所有客户端都需要更新。当库附带验证服务器所需的最小可能的抵消密钥时,就会出现此问题(通常推荐的方法)。例如,Ruby HTTP 库不使用默认 CA 密钥,建议添加尽可能少的密钥:stackoverflow.com/questions/9199660/…
  • 希望根 CA 可以采用比您更好的安全措施。 en.wikipedia.org/wiki/Key_Ceremony

标签: security ssl https public-key-encryption


【解决方案1】:

您需要使用服务器的密钥对,而不是 CA。建立 HTTPS 连接时,数据将在提供的公钥下加密。为了解密该数据,服务器将需要访问相应的私钥,如果您拥有 CA 的私钥,那将是真的糟糕。

CA 的目的是让客户端可以通过一些受信任的第三方来验证服务器的证书。您的客户端将需要 CA 证书来正确验证服务器,但可能已经拥有并信任该 CA。

根据您的评论进行编辑:

发送 CA 证书而不只是发送服务器证书有更多优势。

主要原因是如果服务器的私钥被泄露,您不需要向所有客户端分发新证书。由于 CA 应该比您的服务器受到更好的保护,因此 CA 可以简单地颁发一个新证书,客户端无需任何额外工作即可信任该证书。

如果您交付了服务器的证书,则需要一种方法来安全地更新每个客户端上的证书。

【讨论】:

  • 问题不在于服务器,而在于客户端。为什么客户端需要附带 CA 密钥来验证服务器,而不能直接附带服务器的公钥(通过浏览器获取并验证)?
  • 更新了答案。如果 CA 是受信任的,那么您不需要做任何特别的事情。在发生妥协的情况下也更容易,因为 CA 更容易保护,您不必使用新的服务器证书更新客户端。
  • 您的答案在编辑后自相矛盾,但他不需要使用任何人的密钥对:他需要使用证书,只包含一个公钥;他应该寄送最高签名者的证书。服务器的公钥不用于加密 SSL 中的任何内容,但客户端使用它来验证服务器生成的签名,以证明它拥有该证书。
  • 这并不矛盾,只是我的措辞可能不清楚。我会清理它。但是在握手过程中,pre-master secret 是在服务器的公钥下加密的。请参阅publib.boulder.ibm.com/infocenter/wmqv6/v6r0/… 的第 4 步
  • 抱歉,我在编辑过程中对“密钥对”有点草率。
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2016-03-03
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多