如何在 OpenSSL 中设置 SSL 协议优先级
How to set up SSL protocols priority in OpenSSL
我正在使用 OpenSSL 实现 SSL 客户端
(1) 仅 "speaks" 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 中是否有任何 "elegant" 方法来执行此操作,或者我是否必须尝试多个连接以检查是否可以通信,如果不能,请尝试使用较低的协议版本?
谢谢。
没有协议优先级设置。客户端将向服务器宣布它可以做的最好的版本,服务器将选择这个或更低的版本。如果客户端不支持服务器选择的版本,则握手将失败。这不是 OpenSSL 特有的,但这是 SSL/TLS 的工作方式。
不要将客户端和服务器之间的这种握手与大多数浏览器使用的 TLS 降级机制混淆。在这种情况下,如果与较高版本的握手失败,浏览器会在较低版本的新 TCP 连接上重试 SSL 握手。此行为是为了解决损坏的 SSL/TLS 实现。这些降级主要限于浏览器,更简单的 TLS 堆栈容忍度较低,如果第一次握手失败则永久失败。
我正在使用 OpenSSL 实现 SSL 客户端 (1) 仅 "speaks" 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 中是否有任何 "elegant" 方法来执行此操作,或者我是否必须尝试多个连接以检查是否可以通信,如果不能,请尝试使用较低的协议版本?
谢谢。
没有协议优先级设置。客户端将向服务器宣布它可以做的最好的版本,服务器将选择这个或更低的版本。如果客户端不支持服务器选择的版本,则握手将失败。这不是 OpenSSL 特有的,但这是 SSL/TLS 的工作方式。
不要将客户端和服务器之间的这种握手与大多数浏览器使用的 TLS 降级机制混淆。在这种情况下,如果与较高版本的握手失败,浏览器会在较低版本的新 TCP 连接上重试 SSL 握手。此行为是为了解决损坏的 SSL/TLS 实现。这些降级主要限于浏览器,更简单的 TLS 堆栈容忍度较低,如果第一次握手失败则永久失败。