【发布时间】: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