gpt4 book ai didi

ssl - OpenSSL 让服务器和客户端协商方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:22 30 4
gpt4 key购买 nike

按照一个非常过时的教程,我设法使用带有 TLS1.2 的 OpenSSL 创建了一个 HTTPS 服务器,我为此感到非常自豪 ;)

但是 TLS 1.2 仅在最新的浏览器中受支持,我想在客户端和服务器之间进行某种协议(protocol)协商,我确信可以完成,但我无法找到如何!因此,如果客户端仅支持 TLS1.0,我们将使用它。如果它仅支持 SSLv3,请使用它。不确定 SSLv2,也许最好留下...

我现在使用的代码是:

SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ssl_method = TLSv1_2_server_method();
ssl_ctx = SSL_CTX_new(ssl_method);

然后加载服务器证书,并在所有连接之间共享 ssl_ctx。当客户端被服务器套接字接受时,它被封装在一个 SSL 对象中(无论它代表什么):

ssl = SSL_new(ssl_ctx);
SSL_set_fd(ssl, client_socket);
SSL_accept(ssl);

所以我想在 ssl_ctx 的创建过程中必须改变一些东西以允许更多的方法......有什么想法吗?

找不到 OpenSSL 的体面、广泛的文档,最好的可用的是 10 年前的教程!

提前致谢。

最佳答案

您可以使用 SSLv23_method() 来做到这一点(和 friend )而不是特定的方法(例如 TLSv1_2_server_method() 在你的例子中)。这会发送 SSLv2 ClientHello,但也会指定支持的最高协议(protocol)。有点过时了man page说:

SSLv23_method(void), SSLv23_server_method(void), SSLv23_client_method(void)

A TLS/SSL connection established with these methods will understand the SSLv2, SSLv3, and TLSv1 protocol. A client will send out SSLv2 client hello messages and will indicate that it also understands SSLv3 and TLSv1. A server will understand SSLv2, SSLv3, and TLSv1 client hello messages. This is the best choice when compatibility is a concern.

此在线手册页不讨论较新的 TLSv1_1 和 TLSv1_2 协议(protocol),但我在 s23_clnt.c 的 1.0.1g 源代码中验证了 SSLv23_method() 包含他们。

然后使用 SSL_CTX_set_options() 限制您实际接受的协议(protocol):

The list of protocols available can later be limited using the SSL_OP_NO_SSLv2, SSL_OP_NO_SSLv3, SSL_OP_NO_TLSv1 options of the SSL_CTX_set_options() or SSL_set_options() functions. Using these options it is possible to choose e.g. SSLv23_server_method() and be able to negotiate with all possible clients, but to only allow newer protocols like SSLv3 or TLSv1.

但是请注意,您不能启用任意组协议(protocol),只能启用 SSLv2、SSLv3、TLSv1、TLSv1_1、TLSv1_2 中的连续协议(protocol)。例如,您不能只选择 SSLv3 和 TLSv1_1,而忽略 TLSv1。源代码中的这条评论解释了原因:

SSL_OP_NO_X disables all protocols above X if there are some protocols below X enabled. This is required in order to maintain "version capability" vector contiguous. So that if application wants to disable TLS1.0 in favour of TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2.

关于ssl - OpenSSL 让服务器和客户端协商方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23709664/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com