ssl - 如何在 OpenSSL 中设置 SSL 协议(protocol)优先级

标签 ssl openssl

我正在使用 OpenSSL 实现一个 SSL 客户端 (1) 只“讲”TLS 1.2、TLS 1.1 和 TLS 1.0, (2) 准确设置此优先级:TLS 1.2。如果无法通信,请使用 TLS 1.1。如果没有,TLS 1.0。如果不是,则拒绝连接。

我通过使用实现 (1)

SSL_CTX_set_options(m_ssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);

但我不知道有什么方法可以实现(2)。在 OpenSSL 中是否有任何“优雅”的方式来执行此操作,或者我是否必须尝试多个连接以检查是否可以进行通信,如果不能,则尝试使用较低的协议(protocol)版本?

谢谢。

最佳答案

没有协议(protocol)优先级设置。客户端将向服务器宣布它可以做的最好的版本,服务器将选择这个或更低的版本。如果客户端不支持服务器选择的版本,则握手将失败。这并非特定于 OpenSSL,但这是 SSL/TLS 的工作方式。

不要将客户端和服务器之间的这种握手与大多数浏览器使用的 TLS 降级机制混淆。在这种情况下,如果与较高版本的握手失败,浏览器会在较低版本的新 TCP 连接上重试 SSL 握手。此行为是为了解决损坏的 SSL/TLS 实现。这些降级主要限于浏览器,更简单的 TLS 堆栈容忍度较低,如果第一次握手失败,就会永久失败。

关于ssl - 如何在 OpenSSL 中设置 SSL 协议(protocol)优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29080973/

相关文章:

java - TLSv1.3 - java.io.EOFException : SSL peer shut down incorrectly

apache - 仅在 ssl 请求时将子域转发到主域

ssl - 使用 openssl 创建由中间证书签名的新 TLS 证书

ssl - 尝试将 websocket 连接到安全的客户端端点会引发错误 : XNIO000100: 'https' URL scheme chosen but no SSL provider given

Azure 应用程序网关运行状况检查证书不匹配

c++ - rsa_private_decrypt 返回-1,错误0x0306B067

openssl - 调用 EVP_DecryptUpdate 后可以设置 AES-GCM 标签吗?

Apache SSL 配置错误(SSL 连接错误)

java - 如何使用 EVP_Sign 函数计算签名

在 Cygwin 软件包列表中找不到 Openssl