我的服务器可能附加到 RSA 或 ECDSA 证书。
在我的代码中,我将 prtocol 方法设置为
sslmethod = SSLv23_server_method();
并使用 SSL_CTX_set_cipher_list() API 设置密码。
问题是当服务器附加到 ECDSA 证书时,如果我传递“RSA”密码,则 SSL_CTX_set_cipher_list() 不会返回任何错误,尽管“RSA”密码与 ECDSA 证书不兼容。
是否有任何 openssl API 可用于查明我们要设置的密码是否与证书或协议(protocol)兼容?
最佳答案
Is there any openssl API which I can use to find out if the cipher we are going to set is compatible with the certificate or with protocol or not?
如果您编写应用程序并拥有服务器,那么是的,您确实知道会发生什么。但一般情况是NO,你事先不知道,也无法查询。您尝试设置一个 channel ,如果失败,则尝试其他方法。
一般来说,没有办法提前知道服务器支持哪些密码套件;或者服务器的证书中绑定(bind)了什么类型的公钥。事实上,没有办法知道服务器支持哪些协议(protocol)版本(SSLv2、SSLv3、TLS 1.0、TLS 1.1、TLS 1.2 等)。这是 RFC 7405, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks 的原因.
在 2016/2017 年,您能做的最好的事情就是假设:
- 无 SSLv2、SSLv3;仅 TLS 1.0 及更高版本
- 来自“HIGH:!aNULL:!kRSA:!RC4:!MD5”集合的密码套件
“!kRSA”是“无 RSA key 传输”,这意味着您只能使用临时 key 交换。如果服务器有 RSA key ,那么它将仅用于身份验证。也就是说, key 将用于在 key 交换期间对服务器的临时值进行签名,以便客户端知道它们是真实的。
关于ssl - 确定协议(protocol)和密码与服务器证书的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42483560/