最后更新:2022-06-28 19:04:24 手机定位技术交流文章
目前我们使用的大部分openssl库都是基于协议.0.2版本系列的TLS1.2,如果你想支持更高的TLS1.3协议,您必须使用openssl.1.Version1或3.0版本的1。升级openssl库可能导致SSL对话失败,我在升级
wincurl
时,意外的收获是一个功能.这个功能非常令人印象深刻,但真正的意义是巨大的。
在大多数情况下,如果你不叫这个函数,不影响SSL对话和通信,但有时一些服务器拒绝。一旦被拒绝,找到一个具体的原因会非常痛苦。这个函数比HTTP协议中的HOST字段更有意义,它具有与NGINX逆代理服务器名称相同的功能。为了理解这个函数的意义,在配置nginx反向代理时,您可能需要在将来采取一些捷径。
此函数是SSL_set_tlsext_host_name。在介绍此函数之前,让我们快速地看一下TLS协议和openssl的发展。
自2018年起,TLS1.3标准已经发布,然而,目前,几乎所有国家网站都没有增加到TLS1.3支持,大多数主流网站仍然基于TLS1。目前,TLS1正在国内使用。其他公司如 Sina 、 Netbet 、 Searchfox 、 Tencent 、 Huawei 、 Weibo 、 Baidu 等仍然使用TLS1.2标准。
网站支持TLS1吗?这并不重要,重要的是浏览器是否支持TLS1。目前市场所有主要浏览器都升级到TLS1.3。因此对于用户而言,它支持TLS 1.第三个网站仍然支持TLS1.2的网站,没有问题访问它。或者, 对最终用户来说, 访问是不敏感的.
为什么TLS3.0已经存在了五年,主要的网络平台是TLS1。这项 估计 仍然 基于 兼容性 和 稳定性 的 考虑 。如果您达到1.3,导致大量客户无法访问和失去用户,任何平台都无法承受。此外,支持TLS1.3的openssl版本也在不断改进,在其未达到稳定前,最好使用稳定版本。这很可能是几乎所有目前使用TLS1.2理由的平台类型网站的情况。
此外,甚至一些网站也使用TLS1.3协议,它还将继续为2提供1.Access支持(与所有TLS1以下互換)。除非网站的运营商强制使用TLS1.Encryption包3。但是如果你这样做,就会造成大量的1仍然被使用。 2标准客户端程序不能继续访问网站,这 也 意味着 维持 和平 人员 不再 就业 。
这就是为什么我们仍然可以访问TLS1,即使我们没有升级旧版本的openssl库。
它叫TLS1.2,1.3.提及TLS协议,上述协议的实现是openssl库。它支持TLS1。 openssl3的库目前有两个版本系列:一个是 1.1.Series 1,一个是3.0系列。它看起来更像一个过渡版本,openssl团队承诺在2023年9月11日之前支持这个版本,也就是说,明年,在911袭击的22周年(这的确是一个值得纪念的一天),更新将停止1.1.Version 1.这意味着人们还没有开始推广1.1.1的使用,它就已经结束了。
这个其实也不重要,因为3.0是最终的openssl版本,直接跳过了2.0,因此,它体现了openssl的交叉开发。3.0版本是openssl团队的主要推销版本,它也是长期的维护版本,该版本将持续到2026年9月7日。
虽然大多数网页浏览器已经支持TLS1,但浏览器只是一种客户端,
大多数其他客户使用openssl 1.0.2系列版本,连1.0.系列1,这就是我们经常看到的 libay32.dll和ssleay32.The dll库,这些版本不支持协议的TLS1.3。例如,邮递员、曲线、以及QQ、Foxmail、WeChat等下载客户端程序,旧的openssl图书馆仍可使用。1.1.版本1及以上的Openssl库已将库的输出名称更改为 libcrypto和libssl,不过这只是前缀名,如果是 1.1.系列1,接口是-1.1.dll,如果是3.0系列,然后接口是3.dll,我们可以通过openssl库名确定应用程序是否支持TLS1。
从openssl上升级到TLS1。
官网
(https://openssl.(PDF)下载1.1.1或3.0版本的源代码编译。编译完毕后,我们只是替换了openssl图书馆,您可以重新配置和编译您的客户端程序。
使用openssl库编写客户端程序的一般程序如下:首先创建一个接口,并连接到服务器,然后创建ssl,并绑定套接字,通过调用SSL_connect函数来握手操作,成功后,使用SSL_read和SSL_write来沟通业务。
代码通常如下:
上面代码中的SSL_connect函数是最重要的,它内部实现了SSL手握过程,openssl将整个握手实现在一个内部状态机器的方式,这个代码仍然相当模糊。几乎所有的SSL通信故障发生在握手阶段,例如,加密包不匹配,服务器证书没有可靠的签名,等等。
openssl中有一套s_client命令,此命令用于实现客户端通信,它在s_client中实现。在这个巨大的代码中有一个惊人的函数调用,此函数是SSL_set_tlsext_host_name。当客户端发送“ClientHello”消息时,该函数会运行,插入访问服务器名称的扩展字段的主机(服务器)名称。
在调用该函数后,服务器名称字段被添加到ClientHello扩展字段中,如图所示:
当我们为客户编程时,通常不会调用函数,因为你会觉得这个词与它有关系,因为您已经连接到主机服务器,为什么我必须告诉服务器主机名称?如果我们不调用SSL_set_tlsext_host_name函数,SSL对话会失败 吗?事实上,即使没有调用这个功能,也可以成功握手,它不影响正常的TLS通信。
但是如果服务器迫使您检查这个字段,就会导致握手失败,类似于HTTP协议中请求的HOST字段。那么为什么一些服务器被迫检查这个字段?如果服务器绑定了不同的DNS名称(即IP地址绑定多个域名),这个扩展的含义显现出来,服务器根据不同的域名提供不同的证书。
举个例子,假设BAT破产,他们穷得足以分享一个服务器,也就是说,一个IP地址将 Baidu 、 Ali 和 Tencent 三家公司域名结合起来,所有三家公司都申请了域名的数字证书,此时,扩展字段的HOST函数被反映出来,openssl服务器端将根据不同的主机名称决定哪家公司将返回数字证书。这也是Ngnix逆剂的原理,根据不同的域名绘制不同的访问地址.
这篇文章即将结束,也许我们正在调用SSL_set_tlsext_host_name函数,我们不知道它的最终目的是什么,这也是我写这篇文章的原因之一。
本文由 在线网速测试 整理编辑,转载请注明出处。