当一个SSL请求发送到服务器,由于SSL的client hello中有自己支持的所有加密套件,服务器需要选择。
服务器在选择算法时,会有优先级,是以客户端提供的的为最优,还是服务器端配置的为最优。
所谓客户端最优,就是服务端根据客户端提供的加密套件,从上到下,看是否有本地(服务端)支持的,有的话则使用。
所谓服务器端最优,就是服务器端根据自身配置的加密套件顺序,一个个在client hello中找,找到了就使用。
其次
当服务器配置ECC证书时,加密套件只能选择XXX_ECDSA_XXX或者ECDH_XXX。
当服务器配置RSA证书时,只能选择RSAXXX或者ECDHERSA_XXX形式的加密套件。
需要注意的是,如果加密套件选择ECDH_RSA或者ECDH_ECDSA时,由于ECDH加密套件默认表明了握手需要ECC证书(即ECC证书的公钥充当握手中server key exchange中的公钥,证书的私钥同样也是握手过程中的私钥,握手过程不需要server key exchange),所有第二部分_RSA和_ECDSA表明的是想要的服务器证书签名类型。(这里在谈ECDH而不是ECDHE,评论区有同学混淆了两者概念,区别见:https://blog.csdn.net/mrpre/article/details/78025940)
比如说服务器选择了ECDH_RSA加密套件,但是发送的证书却是ECDSA签名的证书,虽然说证书签名类型不影响整个握手,但是对于校验严格的客户端,这种情况可能会导致客户端断开链接。
详见 RFC:https://tools.ietf.org/html/rfc4492#section-2.3