Security CA公钥与服务器公钥:我应该使用什么来建立HTTPS连接?

Security CA公钥与服务器公钥:我应该使用什么来建立HTTPS连接?,security,ssl,https,public-key-encryption,Security,Ssl,Https,Public Key Encryption,我需要创建一个客户端库,通过HTTPS与单个服务(比如google.com)进行对话。 我希望库附带验证服务所需的所有数据(证书或密钥) 我不知道这些数据应该是什么。它应该是签署google.com证书的证书颁发机构的公钥吗?还是应该是google.com的公钥 在我看到的所有示例中,证书颁发机构的公钥用于验证连接。但这似乎没有必要。如果我的库仅与google.com通信,我是否可以通过安全通道(浏览器)获取并保存google.com公钥,然后直接使用该密钥建立经过身份验证的连接,而无需再次使用

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

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


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

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

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

根据您的评论进行编辑:

提供CA证书而不仅仅是服务器证书有更多的优点

主要原因是,如果服务器的私钥遭到破坏,您不需要向所有客户端分发新证书。由于CA应该比您的服务器得到更好的保护,CA只需颁发一个新的证书,客户端就可以信任它,而无需做任何额外的工作


如果您提供了服务器的证书,则需要一种在每个客户端上安全更新证书的方法

SSL不是这样工作的。您只需要一个受信任的根CA,这样您就可以验证服务器发送的证书。@SLaks但我的理解是,引入CA是为了允许对大量站点进行身份验证,而无需将其所有密钥存储在客户端(管理噩梦)。如果库与单个服务器通信并且拥有该服务器的公钥,是否仍需要证书验证(如果证书是伪造的,则公钥无论如何都不会工作)?您是对的;您可以存储单个公钥,并要求服务器使用该公钥。然而,这使得不可能替换密钥,这就是PKI和CRL存在的原因。如果私钥泄露,你会怎么做?@SLaks这确实是个问题,如果私钥泄露,所有客户端都需要更新。但类似地,如果CA密钥被泄露,或者服务器更改CA,则需要更新所有客户端。当库附带验证服务器所需的最小可能设置密钥时(通常推荐的方法),就会出现此问题。例如,RubyHTTP库不使用默认的CA密钥,建议添加尽可能少的密钥:希望根CA可以采用比您更好的安全措施。问题不在于服务器,而在于客户机。为什么客户端需要附带CA密钥来验证服务器,而不能直接附带服务器的公钥(通过浏览器获取和验证)?更新答案。如果CA是可信的,那么您不需要做任何特殊的事情。在发生妥协的情况下,这也更容易,因为CA更容易保护,并且您不必使用新的服务器证书更新客户端的证书。编辑后,您的答案自相矛盾,但他不需要使用任何人的密钥对:他需要使用只包含公钥的证书;他应该把最高签字人的证书寄出去。服务器的公钥不用于加密SSL中的任何内容,但客户端使用它来验证服务器生成的签名,作为其拥有该证书的证据。它本身并不矛盾,我只是可能不清楚我的措辞。我会把它清理干净。但在握手过程中,预主密钥在服务器的公钥下加密。参见道歉的第4步,在编辑过程中,我对“密钥对”有点马虎。