【发布时间】:2019-12-12 12:09:02
【问题描述】:
当服务器向客户端发送证书消息时,服务器证书中的公钥将用于验证服务器的身份(用公钥解密)。
服务器在其证书消息之后使用 ServerKeyExchange 消息,会话密钥信息使用服务器证书中包含的相同公钥进行签名(使用公钥加密)。
所以我觉得公钥也可以用来加密和解密数据,对吗? 如果是,我想知道为什么教科书只说明一个密钥(例如公钥)用于加密,而另一个(私钥)用于解密,而不是提到一个密钥可以用于加密和解密?
[更新2]
非常感谢布鲁诺的帮助。
在反复阅读了 Bruno 的回复和 RFC4346(第 7.4.2 和 7.4.3 节)之后,我突然觉得我抓住了要点。 :)
但是,我不确定我是否正确,希望有人能证实我的以下理解。谢谢。
1.服务器证书
SSL 和 TLS 基础 3.6.1 部分:
(SSL 和 TLS 基础:保护网络作者:Stephen A. Thomas)
...服务器证书中的公钥将仅用于验证其(服务器)身份。
布鲁诺写道,
服务器证书中的公钥不用于验证服务器本身的身份。
我现在同意 Bruno 的观点,因为证书只是一个私钥签名(加密)的消息,其中还包含其他人(例如客户端)的公钥,因此客户端应该使用服务器公钥的可信副本密钥(通常,Web 浏览器预先包含几十个这样的证书),而不是服务器证书中的公钥,用于验证服务器的身份。
对吗?
2.服务器密钥交换
SSL 和 TLS 基本部分 3.6.2:
...密钥信息使用服务器证书中包含的公钥进行签名。
布鲁诺写道,
同样,您并没有真正使用公钥签署某些东西。您只需要其中一个密钥即可签名,那就是私钥。您使用匹配的公钥验证签名。 ... “使用公钥签名”是一种不寻常且具有误导性的表达方式。
我认为布鲁诺是对的。原因如下,
RFC4346 部分7.4.2. Server Certificate
它必须包含一个与密钥交换方法相匹配的密钥,如下所示。
密钥交换算法证书密钥类型 RSA RSA 公钥;证书必须 允许密钥用于加密。 DHE_DSS DSS 公钥。 DHE_RSA 可用于签名的 RSA 公钥。 DH_DSS Diffie-Hellman 密钥。使用的算法 签署证书必须是 DSS。 DH_RSA Diffie-Hellman 密钥。使用的算法 签署证书必须是 RSA。
因此服务器首先在证书中发送 6 种公钥类型之一。
RFC4346 部分 [7.4.3 服务器密钥交换消息][2]
>服务器密钥交换消息由服务器发送。
>...
>这适用于以下密钥交换方法: > DHE_DSS
DHE_RSA
DH_anon
>...
>此消息传达加密信息以允许客户端传达预主密钥。
服务器选择 3 种密钥交换方法之一,并使用其私钥对加密信息进行签名(加密)。
客户端收到加密后的密码信息后,会使用ServerCertificate消息中的公钥进行验证(解密),得到明文的密码信息。
对吗?
【问题讨论】:
-
ServerKeyExchange 消息不使用服务器证书消息中的公钥。仔细阅读 TLS 规范。
-
如果您在此过程中坚持使用术语“签名”和“验证”,而不是“签名(加密)”和“验证(解密)”,您会做得更好。否则,您只会使自己感到困惑。加密和解密以相反的方式使用密钥。引擎盖下都是一样的,但不要让它泄漏到您的功能描述中。
-
'服务器使用 ServerKeyExchange 消息跟随其证书消息,会话密钥信息使用服务器证书中包含的相同公钥进行签名'不正确。它使用服务器的 private 密钥进行签名。
标签: ssl cryptography