ssl - 确定协议(protocol)和密码与服务器证书的兼容性

标签 ssl openssl ecdsa

我的服务器可能附加到 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/

相关文章:

在 Ubuntu 20.04 和 Debian 10 中 ClientHello 后 SSL 握手失败(适用于 Ubuntu 18.04 和 Debian 9)

c - 使用 OpenSSL API 验证 Authenticode 签名的可执行文件和 DLL

tomcat - 无法使用 key 、证书和 CA 证书链长度 : 1 为 Tomcat 创建 keystore

运行 paramiko 时 Python 模块 ecdsa 错误

go - 无法验证 ECDSA 签名

php - cURL错误60 : SSL certificate in Laravel 5 while Facebook authentication如何解决

java - 在 keystore 文件中查找别名

c++ - ECDSA 使用 OpenSSL 签名,使用 Crypto++ 验证

docker - 尝试在Traefik上配置HTTPS时获取502 Bad Gateway

MongoDB 集群升级以使用 SSL/TLS 失败