的只是在原本的协商机制中把对 HTTP 协议的协商加进去。Google 在 SPDY 协议中开发了一个名为 NPN(Next Protocol Negotiation,下一代协议协商)的 TLS 扩展。随着 SPDY 被 HTTP/2 取代,NPN 也被官方修订为 ALPN(Application Layer Protocol Negotiation,应用层协议协商)。
下图,是caniuse.com网站统计的支持HTTP/2的浏览器版本,以及支持的协商协议。可以看到chrome到41版本才支持,IE根本不支持。
4. SSL/TLS
互联网加密通信协议的历史,几乎与互联网一样长。
-
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
-
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
-
1996年,SSL 3.0版问世,得到大规模应用。
-
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
-
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
目前常用的 HTTP 协议是 HTTP1.1,常用的 TLS 协议版本有如下几个:TLS1.2, TLS1.1, TLS1.0 和 SSL3.0。
-
其中 SSL3.0 由于 POODLE 攻击已经被证明不安全
-
TLS1.0 也存在部分安全漏洞,比如 RC4 和 BEAST 攻击
-
TLS1.2 和 TLS1.1 暂时没有已知的安全漏洞,比较安全,同时有大量扩展提升速度和性能,推荐
那么如何建立TLS链接的呢?大概步骤如下:
(网图)
-
客户端将自己支持的一套加密算法、HASH算法发送给服务端
-
服务端从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了服务端的地址(域名),加密公钥,以及证书的颁发机构等信息
-
客户端获得证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给服务端
-
服务端接收客户端发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用客户端发来的数字串加密一段握手消息发给客户端
-
客户端解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前客户端生成的随机密码并利用对称加密算法进行加密通信
4.1 实现库
TLS协议的设计目标是构建一个安全传输层(Transport Layer Security ),在基于连接的传输层(如tcp)之上提供。
TLS是用来做加密数据传输的,因此它的主体当然是一个对称加密传输组件。为了给这个组件生成双方共享的密钥,因此就需要先搞一个认证密钥协商组件,TLS协议自然分为:
-
做对称加密传输的record协议 ,the record protocol
-
做认证密钥协商的handshake协议,the handshake protocol
还有3个很简单的辅助协议:
-
changecipher spec 协议,the changecipher spec protocol, 用来通知对端从handshake切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)
-
alert协议,the alert protocol, 用来通知各种返回码,
-
application data协议, The application data protocol,就是把http,smtp等的数据流传入record层做处理并传输。
(网图)
如上看到,要实现TLS协议是很复杂的,目前他的实现也已经有很多了,当然最著名的当属 openssl 。在wikipedia里已经列的很详细了。gRPC里由于是基于netty的,netty里的TLS实现库主要是BoringSSL、OpenSSL
大家可以参考
https://en.wikipedia.org/wiki/Comparison_of_TLS_implementations
5. CA(证书)
它的作用就是提供证书(即服务器证书,由域名、公司信息、序列号和签名信息组成)加强服务端和客户端之间信息交互的安全性,以及证书运维相关服务。任何个体/组织都可以扮演 CA 的角色,只不过难以得到客户端的信任,能够受浏览器默认信任的 CA 大厂商有很多,其中 TOP5 是 Symantec、Comodo、Godaddy、GolbalSign 和 Digicert。
证书也挺贵的,对于个人来说,还是算了。就是我们伟大的12306用的也是自建证书。
5.1 证书标准
X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.
5.2 编码格式
同样的X.509证书,可能有不同的编码格式
-
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.
-
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.
5.3 相关的文件扩展名
虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.
-
CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.
-
CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.
-
KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
-
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书