理解HTTPS连接:从机制到应用实践
一、引言
随着互联网技术的飞速发展,网络安全问题日益突出。
HTTP协议作为互联网上的主要通信协议,由于其明文传输的特性,存在着诸多安全隐患。
为了解决这个问题,HTTPS协议应运而生。
HTTPS是一种通过SSL/TLS技术实现的安全通信协议,它可以对HTTP通信进行加密,从而保护数据的机密性和完整性。
本文将详细介绍HTTPS连接的机制及应用实践。
二、HTTPS概述
HTTPS是Hypertext Transfer Protocol Secure的缩写,它是在HTTP协议的基础上,通过SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议提供的安全通信服务。
HTTPS的主要目的是在客户端和服务器之间建立信任,确保数据的传输安全。
其主要功能包括:
1. 加密通信:通过SSL/TLS技术对HTTP通信进行加密,防止数据在传输过程中被窃取或篡改。
2. 身份验证:确保通信双方的身份真实可靠,防止通信过程中的“中间人攻击”。
三、HTTPS连接机制
HTTPS连接的建立涉及多个步骤,主要包括握手过程、证书验证和数据传输。下面详细介绍这些过程:
1. 握手过程:客户端向服务器发送请求时,首先会进行握手过程。在这个过程中,服务器会向客户端发送自己的证书,以证明自己的身份。客户端收到证书后,会进行证书验证,确认证书的有效性以及服务器身份的合法性。握手过程中还包括协商SSL/TLS版本、加密算法等信息。握手成功后,客户端和服务器之间建立了一个安全的通信通道。
2. 证书验证:证书验证是HTTPS连接过程中的关键步骤。服务器通过向客户端发送数字证书来证明自己的身份。数字证书由可信任的第三方机构(如证书颁发机构CA)签发,包含服务器的公钥、证书颁发机构的信息以及证书的有效期等信息。客户端在收到证书后,会验证证书的合法性以及证书颁发机构的可信度。如果验证通过,客户端将继续与服务器进行通信;否则,将中断通信过程。
3. 数据传输:握手过程和证书验证成功后,客户端和服务器之间就可以进行安全的数据传输了。在数据传输过程中,数据会被加密后传输到服务器,保证了数据的安全性。同时,通过对数据的完整性校验,可以确保数据在传输过程中没有被篡改。
四、HTTPS的应用实践
HTTPS在实际应用中的使用非常广泛,如网页浏览、电子邮件、在线支付等场景都需要使用HTTPS来保证数据传输的安全性。下面列举几个常见的应用场景:
1. 网页浏览:HTTPS在网页浏览中的应用最为普遍。通过HTTPS协议访问网站时,浏览器会与网站服务器建立安全的通信通道,保护用户输入的敏感信息(如账号密码、支付信息等)不被窃取或篡改。同时,通过证书验证机制,可以确保访问的网站是合法的,防止用户受到钓鱼网站的攻击。
2. 电子邮件:电子邮件作为一种重要的通信方式,涉及到许多私密信息。通过HTTPS协议进行电子邮件的收发可以保护邮件内容不被窃取或篡改。同时,通过证书验证机制,可以确保邮件服务器的身份合法,防止用户受到垃圾邮件或诈骗邮件的侵扰。
3. 在线支付:在线支付涉及到用户的财产安全。通过HTTPS协议进行在线支付时,用户的银行卡信息、密码等敏感信息会被加密传输到支付服务器,保证了用户财产的安全。同时,通过证书验证机制,可以确保支付平台的安全性,防止用户受到诈骗或虚假交易的风险。
五、总结
本文详细介绍了HTTPS连接的机制及应用实践。
HTTPS作为一种安全通信协议,在互联网应用中发挥着重要作用。
通过SSL/TLS技术实现的安全通信通道可以保护数据的机密性和完整性,防止数据在传输过程中被窃取或篡改。
在实际应用中,HTTPS广泛应用于网页浏览、电子邮件、在线支付等场景,保障了用户的安全需求。
未来随着技术的发展和应用场景的不断拓展,HTTPS将在更多领域得到应用和发展。
怎么用CXF基于https模式实现Web Servers
HTTPS,第二个链接使用本身所标识的协议HTTP。
使用静态超链接的好处是容易实现,不需要额外开发。
然而,它却不容易维护管理; 因为在一个完全使用HTTP协议访问的Web应用里,每个资源都存放在该应用特定根目录下的各个子目录里,资源的链接路径都使用相对路径,这样做是为了方便应用的迁移并且易于管理。
但假如该应用的某些资源要用到HTTPS协议,引用的链接就必须使用完整的路径,所以当应用迁移或需要更改URL中所涉及的任何部分如:域名、目录、文件名等,维护者都需要对每个超链接修改,工作量之大可想而知。
再者
TCP/IP的发展方向。
迅速发展中的互联网将不再是仅仅连接计算机的网络,它将发展成能同电话网、有线电视网类似的信息通信基础设施。
因此,正在使用的IP(互联网协议)已经难以胜任,人们迫切希望下一代 IP即IPv6的出现。
IPv6是IP的一种版本,在互联网通信协议TCP/IP中,是OSI模型第3层(网络层)的传输协议。
它同目前广泛使用的、1974年便提出的IPv4相比,地址由32位扩充到128位。
从理论上说,地址的数量由原先的4.3×109个增加到4.3×1038个。
之所以必须从现行的IPv4改用IPv6, 主要有二个原因。
1.由于互联网迅速发展,地址数量已经不够用,这使得网络管理花费的精力和费用令人难以承受。
地址的枯竭是促使向拥有128位地址空间过渡的首要原因。
2.随着主机数目的增加,决定数据传输路由的路由表在不断加大。
路由器的处理性能跟不上这种迅速增长。
长此以往,互联网连接将难以提供稳定的服务。
经由IPv6,路由数可以减少一个数量级。
为了使互联网连接许多东西变得简单,而且使用容易,必须采用IPv6。
IPv6所以能做到这一点,是因为它使用了四种技术:地址空间的扩充、可使路由表减小的地址构造、自动设定地址以及提高安全保密性。
IPv6在路由技术上继承了IPv4的有利方面,代表未来路由技术的发展方向,许多路由器厂商目前已经投入很大力量以生产支持IPv6的路由器。
当然IPv6也有一些值得注意和效率不高的地方,IPv4/NAT和IPv6将会共存相当长的一段时间。
如何理解连接跟踪机制
连接跟踪定义很简单:用来记录和跟踪连接的状态。
为什么又需要连接跟踪功能呢?因为它是状态防火墙和NAT的实现基础。
Neftiler为了实现基于数据连接状态侦测的状态防火墙功能和NAT地址转换功能才开发出了连接跟踪这套机制。
那就意思是说:如果编译内核时开启了连接跟踪选项,那么Linux系统就会为它收到的每个数据包维持一个连接状态用于记录这条数据连接的状态。
接下来我们就来研究一下Netfilter的连接跟踪的设计思想和实现方式。
之前有一副图,我们可以很明确的看到:用于实现连接跟踪入口的hook函数以较高的优先级分别被注册到了netfitler的NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT两个hook点上;用于实现连接跟踪出口的hook函数以非常低的优先级分别被注册到了netfilter的NF_IP_LOCAL_IN和NF_IP_POST_ROUTING两个hook点上。
其实PRE_ROUTING和LOCAL_OUT点可以看作是整个netfilter的入口,而POST_ROUTING和LOCAL_IN可以看作是其出口。
在只考虑连接跟踪的情况下,一个数据包无外乎有以下三种流程可以走:一、发送给本机的数据包流程:PRE_ROUTING—-LOCAL_IN—本地进程,如果是新的包,在PREROUTING处生成连接记录,通过POSTROUTING后加到hash表二、需要本机转发的数据包流程:PRE_ROUTING—FORWARD—POST_ROUTING—外出,在PREROUTING处生成连接记录,在LOCAL_IN处把生成的连接记录加到hash表三、从本机发出的数据包流程:LOCAL_OUT—-POST_ROUTING—外出,在LOCAL_OUT处生成连接记录,在POSTROUTING处把生成的连接记录加到hash表。
我们都知道在INET层用于表示数据包的结构是大名鼎鼎的sk_buff{}(后面简称skb),如果你不幸的没听说过这个东东,那么我强烈的建议你先补一下网络协议栈的基础知识再继续阅读这篇文章。
在skb中有个成员指针nfct,类型是struct nf_conntrack{},该结构定义在include/linux/skbuff.h文件中。
该结构记录了连接记录被公开应用的计数,也方便其他地方对连接跟踪的引用。
连接跟踪在实际应用中一般都通过强制类型转换将nfct转换成指向ip_conntrack{}类型(定义在include/linux/netfilter_ipv4/ip_conntrack.h里)来获取一个数据包所属连接跟踪的状态信息的。
即:Neftilter框架用ip_conntrack{}来记录一个数据包与其连接的状态关系。
同时在include/linux/netfilter_ipv4/ip_conntrack.h文件中还提供了一个非常有用的接口:struct ip_conntrack *ip_conntrack_get(skb, ctinfo)用于获取一个skb的nfct指针,从而得知该数据包的连接状态和该连接状态的相关信息ctinfo。
从连接跟踪的角度来看,这个ctinfo表示了每个数据包的几种连接状态:lIP_CT_ESTABLISHEDPacket是一个已建连接的一部分,在其初始方向。
lIP_CT_RELATEDPacket属于一个已建连接的相关连接,在其初始方向。
lIP_CT_NEWPacket试图建立新的连接lIP_CT_ESTABLISHED+IP_CT_IS_REPLYPacket是一个已建连接的一部分,在其响应方向。
lIP_CT_RELATED+IP_CT_IS_REPLYPacket属于一个已建连接的相关连接,在其响应方向。
在连接跟踪内部,收到的每个skb首先被转换成一个ip_conntrack_tuple{}结构,也就是说ip_conntrack_tuple{}结构才是连接跟踪系统所“认识”的数据包。
那么skb和ip_conntrack_tuple{}结构之间是如何转换的呢?这个问题没有一个统一的答案,与具体的协议息息相关。
例如,对于TCP/UDP协议,根据“源、目的IP+源、目的端口”再加序列号就可以唯一的标识一个数据包了;对于ICMP协议,根据“源、目的IP+类型+代号”再加序列号才可以唯一确定一个ICMP报文等等。
对于诸如像FTP这种应用层的“活动”协议来说情况就更复杂了。
本文不试图去分析某种具体协议的连接跟踪实现,而是探究连接跟踪的设计原理和其工作流程,使大家掌握连接跟踪的精髓。
因为现在Linux内核更新的太快的都到3.4.x,变化之大啊。
就算是2.6.22和2.6.21在连接跟踪这块还是有些区别呢。
一旦大家理解了连接跟踪的设计思想,掌握了其神韵,它再怎么也万变不离其宗,再看具体的代码实现时就不会犯迷糊了。
俗话说“授人一鱼,不如授人一渔”,我们教给大家的是方法。
有了方法再加上自己的勤学苦练,那就成了技能,最后可以使得大家在为自己的协议开发连接跟踪功能时心里有数。
这也是我写这个系列博文的初衷和目的。
与君共勉。
在开始分析连接跟踪之前,我们还是站在统帅的角度来俯视一下整个连接跟踪的布局。
这里我先用比较粗略的精简流程图为大家做个展示,目的是方便大家理解,好入门。
当然,我的理解可能还有不太准确的地方,还请大牛们帮小弟指正。
我还是重申一下:连接跟踪分入口和出口两个点。
谨记:入口时创建连接跟踪记录,出口时将该记录加入到连接跟踪表中。
我们分别来看看。
入口:整个入口的流程简述如下:对于每个到来的skb,连接跟踪都将其转换成一个tuple结构,然后用该tuple去查连接跟踪表。
如果该类型的数据包没有被跟踪过,将为其在连接跟踪的hash表里建立一个连接记录项,对于已经跟踪过了的数据包则不用此操作。
紧接着,调用该报文所属协议的连接跟踪模块的所提供的packet()回调函数,最后根据状态改变连接跟踪记录的状态。
出口:整个出口的流程简述如下:对于每个即将离开Netfilter框架的数据包,如果用于处理该协议类型报文的连接跟踪模块提供了helper函数,那么该数据包首先会被helper函数处理,然后才去判断,如果该报文已经被跟踪过了,那么其所属连接的状态,决定该包是该被丢弃、或是返回协议栈继续传输,又或者将其加入到连接跟踪表中。
连接跟踪的协议管理:我们前面曾说过,不同协议其连接跟踪的实现是不相同的。
每种协议如果要开发自己的连接跟踪模块,那么它首先必须实例化一个ip_conntrack_protocol{}结构体类型的变量,对其进行必要的填充,然后调用ip_conntrack_protocol_register()函数将该结构进行注册,其实就是根据协议类型将其设置到全局数组ip_ct_protos[]中的相应位置上。
ip_ct_protos变量里保存连接跟踪系统当前可以处理的所有协议,协议号作为数组唯一的下标,如下图所示。
结构体ip_conntrack_protocol{}中的每个成员,内核源码已经做了很详细的注释了,这里我就不一一解释了,在实际开发过程中我们用到了哪些函数再具体分析。
连接跟踪的辅助模块:Netfilter的连接跟踪为我们提供了一个非常有用的功能模块:helper。
该模块可以使我们以很小的代价来完成对连接跟踪功能的扩展。
这种应用场景需求一般是,当一个数据包即将离开Netfilter框架之前,我们可以对数据包再做一些最后的处理。
从前面的图我们也可以看出来,helper模块以较低优先级被注册到了Netfilter的LOCAL_OUT和POST_ROUTING两个hook点上。
每一个辅助模块都是一个ip_conntrack_helper{}结构体类型的对象。
也就是说,如果你所开发的协议需要连接跟踪辅助模块来完成一些工作的话,那么你必须也去实例化一个ip_conntrack_helper{}对象,对其进行填充,最后调用ip_conntrack_helper_register{}函数将你的辅助模块注册到全局变量helpers里,该结构是个双向链表,里面保存了当前已经注册到连接跟踪系统里的所有协议的辅助模块。
全局helpers变量的定义和初始化在net/netfilter/nf_conntrack_helper.c文件中完成的。
最后,我们的helpers变量所表示的双向链表一般都是像下图所示的这样子:由此我们基本上就可以知道,注册在Netfilter框架里LOCAL_OUT和POST_ROUTING两个hook点上ip_conntrack_help()回调函数所做的事情基本也就很清晰了:那就是通过依次遍历helpers链表,然后调用每个ip_conntrack_helper{}对象的help()函数。
期望连接:Netfilter的连接跟踪为支持诸如FTP这样的“活动”连接提供了一个叫做“期望连接”的机制。
我们都知道FTP协议服务端用21端口做命令传输通道,主动模式下服务器用20端口做数据传输通道;被动模式下服务器随机开一个高于1024的端口,然后客户端来连接这个端口开始数据传输。
也就是说无论主、被动,都需要两条连接:命令通道的连接和数据通道的连接。
连接跟踪在处理这种应用场景时提出了一个“期望连接”的概念,即一条数据连接和另外一条数据连接是相关的,然后对于这种有“相关性”的连接给出自己的解决方案。
我们说过,本文不打算分析某种具体协议连接跟踪的实现。
接下来我们就来谈谈期望连接。
每条期望连接都用一个ip_conntrack_expect{}结构体类型的对象来表示,所有的期望连接存储在由全局变量ip_conntrack_expect_list所指向的双向链表中,该链表的结构一般如下:结构体ip_conntrack_expect{}中的成员及其意义在内核源码中也做了充分的注释,这里我就不逐一介绍了,等到需要的时候再详细探讨。
连接跟踪表:说了半天终于到我们连接跟踪表抛头露面的时候了。
连接跟踪表是一个用于记录所有数据包连接信息的hash散列表,其实连接跟踪表就是一个以数据包的hash值组成的一个双向循环链表数组,每条链表中的每个节点都是ip_conntrack_tuple_hash{}类型的一个对象。
连接跟踪表是由一个全局的双向链表指针变量ip_conntrack_hash[]来表示。
为了使我们更容易理解ip_conntrack_hash[]这个双向循环链表的数组,我们将前面提到的几个重要的目前还未介绍的结构ip_conntrack_tuple{}、ip_conntrack{}和ip_conntrack_tuple_hash{}分别介绍一下。
我们可以看到ip_conntrack_tuple_hash{}仅仅是对ip_conntrack_tuple{}的封装而已,将其组织成了一个双向链表结构。
因此,在理解层面上我们可以认为它们是同一个东西。
在分析ip_conntrack{}结构时,我们将前面所有和其相关的数据结构都列出来,方便大家对其理解和记忆。
参考该图可是说是连接跟踪部分的数据核心,接下来我们来详细说说ip_conntrack{}结构中相关成员的意义。
lct_general:该结构记录了连接记录被公开应用的计数,也方便其他地方对连接跟踪的引用。
lstatus:数据包连接的状态,是一个比特位图。
ltimeout:不同协议的每条连接都有默认超时时间,如果在超过了该时间且没有属于某条连接的数据包来刷新该连接跟踪记录,那么会调用这种协议类型提供的超时函数。
lcounters:该成员只有在编译内核时打开了CONFIG_IP_NF_CT_ACCT开完才会存在,代表某条连接所记录的字节数和包数。
lmaster:该成员指向另外一个ip_conntrack{}。
一般用于期望连接场景。
即如果当前连接是另外某条连接的期望连接的话,那么该成员就指向那条我们所属的主连接。
lhelper:如果某种协议提供了扩展模块,就通过该成员来调用扩展模块的功能函数。
lproto:该结构是ip_conntrack_proto{}类型,和我们前面曾介绍过的用于存储不同协议连接跟踪的ip_conntrack_protocol{}结构不要混淆了。
前者是个枚举类型,后者是个结构体类型。
这里的proto表示不同协议为了实现其自身的连接跟踪功能而需要的一些额外参数信息。
目前这个枚举类型如下:如果将来你的协议在实现连接跟踪时也需要一些额外数据,那么可以对该结构进行扩充。
lhelp:该成员代表不同的应用为了实现其自身的连接跟踪功能而需要的一些额外参数信息,也是个枚举类型的ip_conntrack_help{}结构,和我们前面刚介绍过的结构体类型ip_conntrack_helpers{}容易混淆。
ip_conntrack_proto{}是为协议层需要而存在的,而ip_conntrack_help{}是为应用层需要而存在。
ltuplehash:该结构是个ip_conntrack_tuple_hash{}类型的数组,大小为2。
tuplehash[0]表示一条数据流“初始”方向上的连接情况,tuplehash[1]表示该数据流“应答”方向的响应情况,见上图所示。
到目前为止,我们已经了解了连接跟踪设计思想和其工作机制:连接跟踪是Netfilter提供的一套基础框架,不同的协议可以根据其自身协议的特殊性在连接跟踪机制的指导和约束下来开发本协议的连接跟踪功能,最后将其交给连接跟踪机制来统一管理。
转载仅供参考,版权属于原作者。
祝你愉快,满意请采纳哦