SSL的握手应该在对等体之间协商包含身份验证、密钥交换、加密和摘要算法的密码套件。但是服务器发送给客户机的X.509证书已经包含了身份验证算法,那么SSL为什么还要重新协商身份验证算法呢?
"密码套件"是关于支持:客户端和服务器尝试选择一组他们都知道如何处理的算法。例如,如果客户端宣布它可以使用TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
,那么服务器知道客户端将知道如何处理DSS签名(通过Diffie-Hellman密钥交换计算),因此服务器可以使用带有DSS公钥的证书。如果我们假设服务器有几个证书(具有不同的密钥类型),这是有意义的:服务器希望向客户端发送"正确"的证书。
(这在一定程度上是理论上的,因为在实践中每个人都支持和使用RSA——或者有时是短暂的用RSA签名的Diffie-Hellman)
首先,正如Thomas的回答所提到的,密码套件是关于支持的(首先)。其次,SSL/TLS不仅支持用于身份验证的证书,还支持其他几种机制。
但是服务器已经发送给客户端的X.509证书包含身份验证算法,那么为什么SSL要协商又是认证算法?
因为你把它颠倒了。首先协商认证算法,然后发送匹配该算法的证书。
除了前面的回复(它们是正确的—服务器将选择与所选的身份验证算法匹配的证书)之外,我应该注意到X.509证书不包含身份验证算法。X.509(或PKIX)证书包含算法参数。即RSA公钥、椭圆曲线参数等。您使用哪种身份验证方法(RSA加密或带有RSA签名的Diffie-Hellman)不是证书所强制要求的。这是与TLS协商的部分。