Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenSSL允许服务器和客户端协商该方法_Ssl_Openssl - Fatal编程技术网

OpenSSL允许服务器和客户端协商该方法

OpenSSL允许服务器和客户端协商该方法,ssl,openssl,Ssl,Openssl,根据一个非常过时的教程,我成功地使用OpenSSL和TLS1.2创建了一个HTTPS服务器,我为此感到非常自豪;) 然而,TLS1.2仅在最新的浏览器中受支持,我想在客户端和服务器之间进行某种协议协商,我相信这是可以做到的,但我无法找到如何做到这一点!因此,如果客户机只支持TLS1.0,那么我们可以使用它。如果它只支持SSLv3,那么就使用它。不确定SSLv2,也许最好还是留下 我现在使用的代码是: SSL_library_init(); OpenSSL_add_all_algorithms()

根据一个非常过时的教程,我成功地使用OpenSSL和TLS1.2创建了一个HTTPS服务器,我为此感到非常自豪;)

然而,TLS1.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\u ctx
。当客户端被服务器套接字
accept
ed时,它被封装在SSL对象中(无论它代表什么):

所以我想在ssl_ctx创建中必须进行一些更改,以允许使用更多的方法。。。有什么想法吗


找不到关于OpenSSL的像样的、广泛的文档,最好的是一个10年的教程

提前感谢。

您可以使用(和朋友)而不是特定的方法(例如示例中的
TLSv1\u 2\u server\u method()
)。这会发送SSLv2 ClientHello,但也会指定支持的最高协议。有些过时的说法是:

SSLv23\u方法(void)、SSLv23\u服务器\u方法(void)、SSLv23\u客户端\u方法(void)

使用这些方法建立的TLS/SSL连接将理解 SSLv2、SSLv3和TLSv1协议。客户端将发送SSLv2 客户端hello消息,并将指示它也理解SSLv3 和TLSv1。服务器将理解SSLv2、SSLv3和TLSv1客户端 你好消息。当兼容性是一个问题时,这是最好的选择 担心

这个在线手册页没有讨论较新的TLSv1_1和TLSv1_2协议,但我在
s23_clnt.c
的1.0.1g源代码中验证了
SSLv23_method()
包含了它们

然后使用
SSL\u CTX\u set\u 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。来源中的这一评论解释了原因:

如果启用了X以下的某些协议,SSL_OP_NO_X将禁用X以上的所有协议。这是保持“版本能力”所必需的。因此,如果应用程序希望禁用TLS1.0以支持TLS1>=1,那么传递SSL\u NO\u TLSv1是不够的,答案是SSL\u OP\u NO\u TLSv1 | SSL\u OP\u NO\u SSLv3 | SSL\u OP\u NO\u SSLv2


“找不到关于OpenSSL的像样的、广泛的文档…”-是的,文档当时很糟糕。但是您应该从OpenSSL wiki查看。
SSLv23\u client\u method()
如果禁用了SSLv2,则不会发送SSLv2 ClientHello消息。
ssl = SSL_new(ssl_ctx);
SSL_set_fd(ssl, client_socket);
SSL_accept(ssl);