HTTPS技术原理以及网站安全架构
HTTP(超文本传输协议Hyper Text Transfer Protocol)是互联网中最常用的通讯协议,HTTPS (Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL。本文将详细介绍HTTPS技术原理以及网站安全架构,包括加密方法、数字证书、数字签名以及SSL,对于每一个建站的人来说,这都是必备的知识。
为什么需要加密传输?
众所周知,HTTP传输是明文传输,也就是说,通过抓包软件将数据截取下来后,很容易就可以获取消息的内容。如果是有线网络或者是企业内部网络,这种情况还不是特别遭,因为有线网络、内部局域网的抓包过程不是那么容易,但是对于无线网络传输,例如3G/4G网络、Wifi网络来说,抓包就太容易了,大部分抓包软件都可以轻松抓取,这样安全性的问题就变得非常严重。
为了保证安全性,我们至少要解决两个问题:一、即便可以抓包,也无法获取消息包的内容;二、需要防止消息包的内容被篡改。
HTTPS就是在HTTP的基础上引入了数字证书(可以用来鉴别身份),以及建立TLS加密隧道(消息在加密隧道中传输,无法被破译),来解决这些问题。
对称加密和非对称加密
什么是对称加密?顾名思义,就是加密密钥和解密密钥是同一个,也就是共享密钥(Shared Key)。
对称加密的好处就是加密、解密用同一个密钥,速度很快,但是最大的问题就是共享密钥的交换,试想一下,如果在网络上明文传输共享密钥,一旦泄露则整个通讯过程就被破解,如果通过线下约定的方式,又非常的不方便,密钥更换过程同样会面临风险。
于是就有了非对称加密,非对称加密就是加密密钥(我们称之为“公钥”)和解密密钥(我们称之为“私钥”)不同,公钥(Public Key)可以类比为锁,私钥(Private Key)可以类比为钥匙。
这样如果客户端要和服务端通信,在使用非对称加密的情况下,整个过程如下:
- 客户端创建自己的公钥A和私钥A‘;
- 服务端创建自己的公钥B和私钥B’;
- 客户端、服务端建立网络通讯,客户端把自己的公钥A传输给服务端,服务端把自己的公钥B传输给客户端;
- 如果客户端要发送消息给服务端,那么客户端用服务端的公钥B加密内容后发送,服务端收到内容后用自己的私钥B‘解密;
- 同理,如果服务端要发送消息给客户端,那么服务端用客户端的公钥A加密内容后发送,客户端收到内容后用自己的私钥A’解密;
可以看到,非对称加密解决了加密密钥在网络上传输的问题,由于公钥只用于加密,所以可以在网络上传输,即便泄露也不会有问题,因为用于解密的私钥永远不会在网络上传输,不会有泄露的风险。
但是,非对称加密的最大问题就是速度太慢,如果每一次的加密、解密都用公钥、私钥操作,会耗费大量的时间。
那么有没有办法呢?当然有。
融合的对称、非对称加密解密方法
对称加密的优点是速度快,缺点是密钥无法在网络上传输;非对称加密的优点是用于加密的公钥可以在网络上传输,缺点是速度慢。那么把两者结合起来,就可以完美的实现加密解密通讯。
步骤如下:
- 客户端创建自己的公钥A和私钥A‘;
- 服务端创建自己的公钥B和私钥B’;
- 客户端、服务端建立网络通讯,客户端把自己的公钥A传输给服务端,服务端把自己的公钥B传输给客户端;
- 客户端产生一个共享密钥C,用服务端的公钥B加密内容后发送,服务端收到内容后用自己的私钥B‘解密后获得共享密钥C;
- 服务端产生一个确认消息,用客户端的公钥A加密内容后发送,客户端收到内容后用自己的私钥A’解密后得到确认消息;
- 至此,双方共同确认在后续的通讯过程中使用共享密钥C进行加密解密;
融合方案的漏洞 – 中间人攻击
融合方案确实解决了密钥交换和速度的问题,那么是不是就完美无缺呢?不是,这个过程中有漏洞,就是“中间人攻击”(Man-In-The-Middle Attack )。
在上面的服务端发送自己的公钥B给客户端的过程中,由于是明文传输,如果消息被“中间人”劫持且篡改了,比如:“中间人”将B保存下来,并且用自己的公钥X替换掉服务端的公钥B,那么客户端收到的公钥就是X而不是B,那么后续客户端就会用公钥X去加密共享密钥C,由于“中间人”拥有私钥X‘,所以就可以轻易的获取共享密钥C,再用B加密C后发送给服务端,就可以让服务端毫不知情。
可以看出,造成这个漏洞的根本原因就是在双方用明文方式交换公钥的时候,缺乏机制去鉴别对方公钥的真伪,这就引入了新的解决方案 – 数字证书和数字签名。
数字证书和数字签名
在日常生活中,如果我们要验证一个人的身份,通常的做法是查看他的身份证。我们信任身份证颁发机构即政府机构的公信力,因此只要验证一个人的身份证不是伪造的,我们就相信这个人的身份和身份证上所描述的是一致的。
数字证书就是一个人或者组织在网络世界中的身份证,其发证机关是证书管理机构(certificate authority,CA)。CA用自己的私钥对用户的身份信息(主要是用户名和该用户的公钥)进行签名,该签名和用户的身份信息一起就形成了证书。
以网上银行应用为例:如果银行的网站和客户的浏览器都申请安装了第三方CA所签发的数字证书,并安装了CA根证书的公钥,那么当客户通过SSL协议通道登录访问网银服务器时,客户端与网银服务器之间就进行了相互认证。当用户登录网银服务器时,网银服务器首先利用事先已装好的CA公钥,去解密验证用户证书的CA签名,验证用户的真实身份;同时还需要检查用户证书的有效性,即网银服务器自动连接到CA的目录服务器,检查用户证书的有效期和是否进入黑名单(CRL检查),这一切若通过,证明该用户是银行的合法用户。除了上述网银服务器要验证用户的真实身份外,用户也要利用CA公钥验证银行网站是否是自己的真实开户行、检查银行证书的有效性等。
上图就是生成用户数字签名的过程:首先将用户的公钥、用户的姓名、证书颁发机构的名称以及证书的有效期通过特定的哈希算法生成信息摘要,然后用CA的私钥进行加密生成数字签名。
那么验证数字签名的过程又是怎样的呢?
将数字证书(内含用户的公钥、姓名、证书机构名称、有效期以及数字签名)、哈希算法发送到对端,对端通过CA公钥(CA通常是公信机构,其根证书可以通过其官网或者其它官方途径进行下载安装,根证书内含CA公钥)对数字签名进行解密,得到信息摘要,同时采用同样的哈希算法对数字证书中的用户的公钥、用户的姓名、证书颁发机构的名称以及证书的有效期进行运算得到信息摘要,比较两份摘要,若相同则验证通过。
验证通过后则该数字证书内的用户的公钥就是可信的,后续可以使用该公钥对信息进行加密传输并发送给该用户,该用户收到内容后,用自己的私钥进行解密获取实际的通信内容。
建立HTTPS连接
以上我们详细说明了实现HTTPS所需的各种技术:加密方法、数字证书和数字签名。下面我们就具体描述一下通讯双方建立HTTPS连接的过程,整个过程分为3步:
1、数字证书、数字签名的生成(线下过程)
服务端(SSL Server)用工具生成自己的公钥和私钥对,将公钥、服务端的名字或者地址、证书机构名称、证书有效期通过哈希算法产生信息摘要,送给CA进行签名,生成数字签名,然后生成经过数字签名的数字证书。
客户端(Client Device)也是同样的方式,用工具生成自己的公钥和私钥对,将公钥、客户端的名字或者地址、证书机构名称、证书有效期通过哈希算法产生信息摘要,送给CA进行签名,生成数字签名,然后生成经过数字签名的数字证书。
另外,服务端、客户端通过CA的官网或者其它渠道将CA的公钥保存到本地,用于鉴别数字签名。
2、TLS/SSL连接建立
客户端、服务端生成了经过CA签名的数字证书,就可以开始建立HTTPS连接了,也就是建立TLS/SSL加密通道,详细的过程可以参考RFC5246标准规范,这里简单说明如下:
1)客户端向服务端发送Client hello消息,携带客户端支持的加密算法列表,发起通讯;
2)服务端回复Server hello,将选择好的加密算法以及服务端数字证书通知客户端;
3)服务端向客户端请求客户端数字证书;
4)客户端将自己的数字证书发送给服务端;
5)客户端通过CA公钥鉴别服务端数字证书,并获取服务端公钥,将新的对称密钥用服务端公钥加密后发送给服务端;
6)客户端证书鉴别请求,当客户端要求服务端使用客户端证书时,发送此消息;
7)客户端完成消息,此消息用新生成的对称密钥加密发送;
8)服务端同样用CA公钥鉴别客户端数字证书,成功后发送完成消息给客户端,此消息用新生成的对称密钥加密发送。
至此,TLS/SSL加密通道建立。
3、在TLS/SSL加密通道中传输HTTP消息
当TLS/SSL加密通道建立后,之后的HTTP消息包都会用对称密钥加密传输。
总结
以上我们详细介绍了HTTPS技术的方方面面,HTTPS通讯以及数字证书是目前全球主流网站采用的信息安全技术,可以有效的保护通讯过程,防止数据被窃听以及被篡改,对于建站来说是必不可少的,本站后面的文章会结合具体的服务提供商(例如Namecheap)讲解为网站安装SSL证书、开启HTTPS连接的实战教程。