{{ it.name }}
{{ it.text }}
TLS or SSL ?
SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层,最初是由网景公司(Netscape)研发,后被 IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC 里包含了很多互联网技术的规范。
起初是因为HTTP在传输数据时使用的是明文(虽然说 POST 提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL 是基于 HTTP 之下 TCP 之上的一个协议层,基于 HTTP 标准并对 TCP 传输数据时进行加密,所以 HTTPS 是 HTTP+SSL/TCP的简称。
由于 HTTPS 的推出受到了很多人的欢迎,在 SSL 更新到 3.0 时,IETF 对 SSL3.0 进行了标准化,并添加了少数机制(但是几乎和 SSL3.0无差异),标准化后的 IETF 更名为 TLS1.0(Transport Layer Security 安全传输层协议),可以说 TLS 就是 SSL 的新版本 3.1 。
TLS(Transport Layer Security)是更为安全的升级版 SSL。但 SSL 这一术语更为常用,实际上 MySQL 使用的就是 TLS 协议,而不是 SSL 协议。
一. TLS 握手过程
1. TLS 握手过程,其实就是秘钥交换的过程,这也是整个TLS 加密技术里最复杂的一个环节。
2. 密钥算法
对称密钥算法:数据加密和解密时使用相同的密钥。非对称密钥算法:数据加密和解密时使用不同的密钥,一个是公开的公钥,一个是由用户秘密保存的私钥。利用公钥(或私钥)加密的数据只能用相应的私钥(或公钥)才能解密。与非对称密钥算法相比,对称密钥算法具有计算速度快的优点,通常用于对大量信息进行加密(如对所有报文加密);而非对称密钥算法,一般用于数字签名和对较少的信息进行加密。
3. 数字证书-如何保证公钥的真实性? 如果有攻击者伪造了 Server 端的公钥并发了客户端,客户端会访问到假网站被窃取信息。显然保证客户端收到的 Server 端的公钥是真实的,是保证整个加密连接可靠性的第一道防线。
数字证书的验证流程:
客户端会使用同样的 Hash 算法获取该数字证书的 Hash 值 H1;
通常浏览器和操作系统中集成了 CA 证书(包含 CA 公钥、所有者),客户端取得这个CA证书,使用其中的 CA 公钥解密签名,得到一个 Hash 值 H2 ;
比较 H1 和 H2,如果值相同,则数字证书可信。
二. MySQL SSL 加密连接
1. MySQL服务端的配置
启动参数:
--ssl:表示 MySQL 服务端允许加密连接,这个启动参数 MySQL8.0默认启用
系统变量:
require_secure_transport:指定是否要求客户端使用加密连接。默认值为 OFF,如果 ON,则表示客户端必须使用加密连接,如果客户端关闭 ssl ,则连接会报错。
以下参数指定加密连接时使用的证书和密钥文件:
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
2. MySQL客户端配置
MySQL 客户端连接 Server 时,通过 --ssl-mode 参数指定:
--ssl-mode=PREFFERED,默认行为,client 端尝试使用加密进行连接,如果无法构建加密连接,则会退回到未加密的连接
--ssl-mode=REQUIRED时,Client 端需要加密连接,如果无法构建连接,则 Client 端将失败
--ssl-mode=DISABLED,Client 端使用未加密的连接
--ssl-mode=VERIFY_CA,Client 端需要加密连接,并且还对 CA 证书进行验证
--ssl-mode=VERIFY_IDENTITY,Client 端需要加密的连接,并且还针对 CA 证书和其证书中的服务器主机名执行验证
3. MySQL SSL 连接中的 TLS 握手过程
上述示例已有详细说明,这里再简要总结一下:
客户端发起 ssl 连接请求;
MySQL Server 发送数字证书 server-cert.pem 给客户端(server-cert.pem包含:服务器公钥、CA签名信息);
客户端使用CA 证书 ca.pem(由于这是 MySQL 自签名的CA证书,无法从操作系统的可信任区获取(压根不在这里边),所以事先必须在客户端本地保存 CA 证书文件)中的 CA 公钥解密 server-cert.pem 中的签名,进行验证;
验证通过后,生成对称密钥,使用 server-cert.pem 中的公钥加密“对称密钥”,发送给 MySQL Server;
MySQL Server 使用自己保留的私钥 server-key.pem 解密,得到“对称密钥”;