我使用RSA密码签署证书, SSL_CTX_set_tmp_ecdh_callback ()api设置密钥交换的ECDH参数。服务器总是最终选择TLS_ECDHE_RSA_ *密码套件。如果我让客户端只在clientHello中发送TLS_ECDH_ *密码套件,则服务器会断开连接,声明“没有共享密码”。
有人能告诉我如何让服务器选择ECDHE_ *上的ECDH_ *密码吗?
服务器如何决定我应该选择ECDHE_ * cipher而不是ECDHE_ *密码?
答案 0 :(得分:2)
现在这已移到了ontopic的地方,并且已经足够澄清,并且派对结束了:
短暂的ECDH套件:使用短暂ECDH密钥交换(ECDHE-*
)的TLS套件至少使用名义上短暂的ECDH密钥,OpenSSL称之为“临时”密钥。 OpenSSL到1.0.2有4-6种设置这些键的方法:
SSL_CTX_set_tmp_ecdh
或SSL_set_tmp_ecdh
设置(仅)要使用的'曲线';确切地说,这是一个EC_GROUP
或正式的'参数集',它由一个由基础场上的曲线方程定义的实际曲线加上一个指定的基点,该基点在足够高阶的曲线上生成一个子组。低辅助因子,但大多数时候我们忽略了这个细节,只称它为'曲线'。然后,OpenSSL在每次握手时和该曲线上生成一条随机密钥。
SSL_CTX_set_tmp_ecdh_callback
或SSL_set_tmp_ecdh_callback
设置在每次握手期间调用的函数,可以设置特定键,也可以设置曲线,OpenSSL会在该曲线上生成随机键。
SSL_CTX_set_ecdh_auto
或SSL_set_ecdh_auto
新建在每次握手期间导致OpenSSL根据客户端问候选择曲线,并在该曲线上生成随机密钥。
请注意,使用ECDHE的每个密码套件还定义了具有匹配证书链的密钥类型,服务器必须使用该证书链进行身份验证:ECDHE-RSA
必须使用RSA密钥和证书,而ECDHE-ECDSA
必须使用ECDSA密钥& cert(或准确的EC密钥和ECDSA证书,因为相同的EC密钥可用于ECDSA,ECDH,ECIES等,但通常不应该使用)。 OpenSSL库可以配置多个密钥和证书对,每种类型一个,命令行s_server
可以使用-cert -key -dcert -dkey
加一个用于SNI -cert2 -key2
的两个静态对,但其他程序可以或可能没有。
然而,在1.1.0中,这些函数被删除,看起来OpenSSL 总是执行以前的ecdh_auto
。
静态ECDH套件:使用静态又称固定ECDH密钥交换(ECDH-*
)的TLS套件使用静态ECDH密钥,不使用临时或临时ECDH密钥。由于它们不使用临时密钥,因此设置临时曲线或密钥所涉及的功能无关紧要,并且没有任何有用的效果。相反,静态ECDH密钥必须在服务器配置的密钥和证书对中 ,并且证书必须允许ECDH,即它不能keyUsage
排除keyAgreement
。此外,在TLS 1.0和1.1中,配置的证书必须由CA使用与密码套件匹配的签名算法进行签名:ECDH-ECDSA
密码套件必须使用由ECDSA CA签署的ECDH证书,并且ECDH-RSA
密码套件必须使用由RSA CA签署的ECDH证书;见rfc4492 section 5.3。对于TLS 1.2 rfc 5246 section 7.4.2和A.7 for ECC放宽了此要求,并允许 CA 证书是客户端的signature_algorithms扩展允许的任何算法。但是在检查时我发现OpenSSL没有实现这种放松,所以我之前评论的一部分是错误的; 即使是1.2,它也要求CA签名算法与密码组匹配。
除了所有协议版本之外,密钥和(EE)证书必须使用客户端在supported_curves扩展中支持的曲线,并且证书必须以“命名”形式表示该密钥(使用OID来标识曲线而不是显式参数)和客户端在supported_formats扩展中支持的点格式。使用OpenSSL客户端,这绝不是一个问题,因为它支持所有命名的曲线和点格式,实际上证书不使用显式曲线参数。
因此,使用OpenSSL获取静态ECDH:
使用EC密钥(SSL_[CTX_]use_PrivateKey*
)和匹配证书(SSL_[CTX_]use_certificate[_chain]*
)配置服务器,该证书允许keyAgreement并由CA使用RSA或ECDSA签名 - 与所有PK-一样基于密码套件还配置客户端验证证书所需的任何链证书
将两端配置为允许(默认情况下为true)并且至少有一端要求或首选项结束使用ECDH-xyz
xyz
RSA
ECDSA
{{}} 1}}或ecdh_tmp
以匹配服务器证书上的CA签名
完全忽略ecdh_auto
和{{1}}
... 除了1.1.0 ,在检查时我发现不再实现任何静态-ECDH 或静态-DH密码套件 - 即使静态 - DH套件仍在密码的联机帮助页中。这不在我能找到的CHANGES文件中,我还没来得及完成代码。
答案 1 :(得分:0)
...除了1.1.0,在检查中我发现它不再实现 任何静态ECDH或静态DH密码套件-即使静态DH 套件仍在密码手册中。这不在 我可以找到的CHANGES文件,但我还没有时间进行 代码呢。
https://github.com/openssl/openssl/commit/ce0c1f2bb2fd296f10a2847844205df0ed95fb8e