超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)。
SSL,Secure Sockets Layer 的缩写,1994年由网景设计的,1999 年,互联网标准化组织接替网景公司,发布了 Transport Sockets Layer 即 TSL。
所谓 HTTPS 就是在 TCP 传输层和 HTTP 应用层之间加入了 TSL/SSL 层,用于加密和解密。
加密
对称加密
对称加密是一种最简答,也最快的加密解密方式。对称,即加密和解密都是用的相同的秘钥。常见的对称加密方法有 DES、3DES、AES、RC5、RC6 等。 https 的传输阶段就是采用对称加密的 http 传输。
非对称加密
加密和解密需要两个不同的秘钥。一般分为公钥和私钥,公钥用于加密,能够提供数字签名的功能,可以任意向外发布;私钥只有持有者保管,通过公钥加密的密文在不安全的网络上传输,只有私钥持有者可以解开获得明文(即使获得了密文和公钥,也无法数以年记的时间内解开)。常见的非对称加密算法有 RSA、ElGamal、背包算法、Rabin、迪菲-赫尔曼算法、椭圆曲线加密算法。 https 的握手阶段是采用的是非对称加密。
数字证书
wiki定义
用于公开密钥基础建设的电子文件,用来证明公开密钥拥有者的身份。此文件包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的整体内容正确无误。电脑系统或其他用户可以通过一定的程序核实证书上的内容,包括证书有否过期、数字签名是否有效,如果信任签发的机构,就可以信任证书上的密钥,凭公钥加密与拥有者进行可靠的通信。
申请数字证书
服务端通过非对称加密算法生成一对公钥和私钥,向 Certificate Authority 即证书认证中心,简称 CA 提供拥有者身份信息和服务端公钥,通过后 CA 会颁发包含服务端公钥,拥有着身份信息和使用 CA 私钥对证书内容的摘要进行加密的密文,即数据签名。
如何确认数字证书有效
- 验证证书是否有效
客户端通过查看证书的有效时间,以及域名等来判断内容是否有效。 - 验证证书是否可信
客户端通过预存的相对应的 CA 根证书的公钥,对数字签名进行解密获取证书的摘要与通过对证书内容进行哈希运算得到的摘要进行对比,相等的话则证明数字证书是该 CA 颁发的是可信的。不相等,则客户端会提示证书不可信。
- 验证证书是否有效
原理
开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手handshake
。
假定客户端叫做爱丽丝,服务器叫做鲍勃,整个握手过程可以用下图说明。
握手阶段分成五步。
- 爱丽丝给出协议版本号、一个客户端生成的随机数
Client random
,以及客户端支持的加密方法。 - 鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数
Server random
。 - 爱丽丝确认数字证书有效,然后生成一个新的随机数
Premaster secret
,并使用数字证书中的公钥,加密这个随机数,发给鲍勃。 - 鲍勃使用自己的私钥,获取爱丽丝发来的随机数,即
Premaster secret
。 - 爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成对话密钥
session key
,用来加密接下来的整个对话过程。
为什么一定要用三个随机数来生成对话密钥,我们来看下面的解释
不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,Premaster secret
本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。Premaster secret
的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么cPremaster secret
就有可能被猜出来,那么仅适用Premaster secret
作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上Premaster secret
三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。
部署
Let’s Encrypt 是一个免费的,自动化的,开放的 CA 机构。通过 certbot ,选择相应的web服务和服务器版本,就可以很快的安装 nginx 的插件和证书。下面以 ubuntu 和 nginx 为例。
安装源及软件
1
2
3
4
5$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx安装证书
1
$ sudo certbot --nginx certonly # 不加 certonly,可以自动配置 nginx,省略下一步
配置 NGINX
在相应的 server 模块中加入如下配置{ ... listen 443; ssl on; ssl_certificate /path/to/server.crt; # 证书路径 ssl_certificate_key /path/to/server.key; # 私钥路径 }
- 重新生成证书
1
$ sudo certbot renew --dry-run