From: 扫盲 HTTPS 和 SSL/TLS 协议[0]:引子html
须要了解的背景知识:node
SSL(Secure Sockets Layer, 安全套接字),由于原先互联网上使用的 HTTP 协议是明文的,存在不少缺点——好比传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。git
到了1999年,SSL 由于应用普遍,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化以后的名称改成 TLS(是“Transport Layer Security”的缩写),中文叫作“传输层安全协议”。github
不少相关的文章都把这二者并列称呼(SSL/TLS),由于这二者能够视做同一个东西的不一样阶段。算法
HTTPS = HTTP + SSL/TLS, 也就是 HTTP over SSL 或 HTTP over TLS.这是后面加 S
的由来 浏览器
相对于HTTP:安全
HTTP对TCP的链接使用分为:服务器
若是是短链接的话,针对每一个HTML资源,就会针对每个外部资源,分别发起一个个 TCP 链接。相反,若是是“长链接”的方式,浏览器也会先发起一个 TCP 链接去抓取页面。可是抓取页面以后,该 TCP 链接并不会当即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。而后浏览器分析 HTML 源码以后,发现有不少外部资源,就用刚才那个 TCP 链接去抓取此页面的外部资源。网络
注意:session
HTTPS的设计要兼容HTTP
关于HTTPS的性能,为了确保性能,SSL 的设计者至少要考虑以下几点:
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,而后用公钥加密信息,服务器收到密文后,用本身的私钥解密。
问题:
所以,SSL/TLS协议的基本过程是这样的:
以下图解:
以下图示:
注意的是,”握手阶段”的全部通讯都是明文的
C向S提供信息以下:
服务器收到客户端请求后,向客户端发出回应,这叫作SeverHello。服务器的回应包含如下内容。
除了上面这些信息,若是服务器须要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。
客户端收到服务器回应之后,首先验证服务器证书。若是证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已通过期,就会向访问者显示一个警告,由其选择是否还要继续通讯。
若是证书没有问题,客户端就会从证书中取出服务器的公钥。而后,向服务器发送下面三项信息。
如今总共有3个随机数,第三个又称”pre-master key”,有了它之后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自 生成 本次会话 所用的 同一把 “会话密钥”。
服务器收到客户端的第三个随机数pre-master key以后,计算生成本次会话所用的”会话密钥”。而后,向客户端最后发送下面信息。
至此,整个握手阶段所有结束。接下来,客户端与服务器进入加密通讯,就彻底是使用普通的HTTP协议,只不过用”会话密钥”加密内容。
不完整总结以下:
首先建立证书
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
实例代码在: ssl_demo