在一个非常过时的教程之后,我设法使用OpenSSL和TLS1.2创建了一个HTTPS服务器,我为此感到非常自豪;)
然而,TLS 1.2仅在最新的浏览器中受支持,我想在客户端和服务器之间进行某种协议的协商,我确信它可以完成,但是我无法找到!因此,如果客户端仅支持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
。当客户端由服务器套接字accept
编辑时,它被封装在SSL对象中(无论它代表什么):
ssl = SSL_new(ssl_ctx);
SSL_set_fd(ssl, client_socket);
SSL_accept(ssl);
所以我想在ssl_ctx创建中必须更改某些内容以允许更多方法...任何想法?
<咆哮>没有体面的,广泛的文档可以找到OpenSSL,最好的是10年的教程! < /咆哮>
提前致谢。
答案 0 :(得分:11)
您可以使用SSLv23_method()
(和朋友)代替特定方法(例如示例中的TLSv1_2_server_method()
)来执行此操作。这将发送SSLv2 ClientHello,但也指定支持的最高协议。有些过时的man page说:
SSLv23_method(void), SSLv23_server_method(void), SSLv23_client_method(void)
使用这些方法建立的TLS / SSL连接将会理解 SSLv2,SSLv3和TLSv1协议。客户端将发送SSLv2 客户端问候消息,表明它也理解SSLv3 和TLSv1。服务器将了解SSLv2,SSLv3和TLSv1客户端 你好消息。当兼容性为a时,这是最佳选择 关注。
此在线手册页未讨论较新的TLSv1_1和TLSv1_2协议,但我在s23_clnt.c
的{{1}}的1.0.1g来源中验证了SSLv23_method()
包含它们。
然后,您使用SSL_CTX_set_options()
限制实际接受的协议:
以后可以使用以下方法限制可用协议列表 SSL_OP_NO_SSLv2,SSL_OP_NO_SSLv3,SSL_OP_NO_TLSv1选项 SSL_CTX_set_options()或SSL_set_options()函数。使用这些 选项可以选择,例如SSLv23_server_method()和 能够与所有可能的客户谈判,但只允许更新 SSLv3或TLSv1等协议。
但请注意,您无法启用任意协议集,只能启用SSLv2,SSLv3,TLSv1,TLSv1_1,TLSv1_2中的连续协议。例如,您不能只选择SSLv3和TLSv1_1,省略TLSv1。来源中的这条评论解释了原因:
SSL_OP_NO_X禁用X 以上的所有协议,如果有一些协议在X以下启用。这是为了保持“版本能力”向量连续所必需的。因此,如果应用程序想要禁用TLS1.0而不支持TLS1> = 1,则传递SSL_NO_TLSv1是不够的,答案是SSL_OP_NO_TLSv1 | SSL_OP_NO_SSLv3 | SSL_OP_NO_SSLv2。