超文本传输安全协议(英语: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 层,用于加密和解密。html
对称加密python
对称加密是一种最简答,也最快的加密解密方式。对称,即加密和解密都是用的相同的秘钥。常见的对称加密方法有 DES、3DES、AES、RC五、RC6 等。 https 的传输阶段就是采用对称加密的 http 传输。
非对称加密nginx
加密和解密须要两个不一样的秘钥。通常分为公钥和私钥,公钥用于加密,可以提供数字签名的功能,能够任意向外发布;私钥只有持有者保管,经过公钥加密的密文在不安全的网络上传输,只有私钥持有者能够解开得到明文(即便得到了密文和公钥,也没法数以年记的时间内解开)。常见的非对称加密算法有 RSA、ElGamal、背包算法、Rabin、迪菲-赫尔曼算法、椭圆曲线加密算法。 https 的握手阶段是采用的是非对称加密。
wiki定义web
用于公开密钥基础建设的电子文件,用来证实公开密钥拥有者的身份。此文件包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的总体内容正确无误。电脑系统或其余用户能够经过必定的程序核实证书上的内容,包括证书有否过时、数字签名是否有效,若是信任签发的机构,就能够信任证书上的密钥,凭公钥加密与拥有者进行可靠的通讯。算法
申请数字证书ubuntu
服务端经过非对称加密算法生成一对公钥和私钥,向 Certificate Authority 即证书认证中心,简称 CA 提供拥有者身份信息和服务端公钥,经过后 CA 会颁发包含服务端公钥,拥有着身份信息和使用 CA 私钥对证书内容的摘要进行加密的密文,即数据签名。安全
如何确认数字证书有效服务器
验证证书是否有效网络
客户端经过查看证书的有效时间,以及域名等来判断内容是否有效。
验证证书是否可信session
客户端经过预存的相对应的 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 为例。
安装源及软件
$ 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
安装证书
$ 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; # 私钥路径 }
从新生成证书
$ sudo certbot renew --dry-run