SSL连接加密
最近更新时间: 2024-10-17 17:10:00
操作场景
本文将介绍当使用非加密方式连接数据库时,在网络中传输的所有信息都是明文,因此存在被非法用户窃听、篡改、冒充的三大风险。而 SSL/TLS 协议是为解决这三大风险而设计的,理论上可达到:
所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。
操作步骤
注意:
- 启用SSL加密会显著增加CPU使用率,明显增加网络连接响应时间,内网(VPC)链路相对较安全,一般无需启用SSL。
- 部分客户端(含应用程序)没有支持 SSL 连接加密模式,可能不兼容或需要调整配置。
- 由于启用 SSL 加密依赖当前 SQL 引擎版本,如果 SQL 引擎不匹配,后台会先进行静默升级(静默升级优先确保现有连接和实例稳定影响,业务无感知升级过程,升级过程可能历时1 - 2小时或更长)。
SSL 概述
SSL 协议要求建立在可靠的传输层协议(TCP)之上。SSL 协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP、FTP、TELNET 等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用 SSL/TLS 协议传输数据的工作效率只有使用不使用协议传输的十分之一。假如为了安全保密,将一个数据库所有的数据通讯应用都启用 SSL 技术来加密,并使用 TLS 协议进行传输,那么该业务系统的性能和效率将会大大降低,而且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别。
SSL 加密并不保护数据本身,而是确保了来往于数据库和服务器之间的流量安全。从某个角度来看,由于企业内网天然的安全和隔离性,管理员通常可以放心内网传输安全,并在必须使用时再进行应用 SSL 连接加密。当然,通常建议管理员利用更合理的方法来应对企业内网的安全和隔离,而非仅仅依赖于 SSL 连接加密。
相关名词
SSL(Secure Sockets Layer):安全套接层,是一种安全协议,目的是为互联网通信提供安全及数据完整性保障,使用 X.509 认证。
TLS(Transport Layer Security):安全传输层,IETF 将 SSL 标准化后的产物。TLS 可以理解为 SSL 的升级版,TLS 目前有三个版本:TLS1.0、TLS1.1、TLS1.2,目前常用的为 TLS1.2,server 配置通常三个版本均支持。
X.509 标准:SSL 证书格式遵循 X.509 标准,X.509 是由国际电信联盟(ITU-T)制定的数字证书标准。X.509 给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理,即一个用户有两把密钥,公钥和私钥,同时该标准也规范了公开密钥认证、证书吊销列表、授权证书、证书路径验证算法等。
Openssl:一个开源的加密库,由 C 语言写成,SSL/TLS 协议基于该库进行的加解密。
认证机构CA(Certificate Authority):在 HTTPS 中是一个很重要的角色,通常称之为认证中心,从广义上讲,认证中心还应该包括证书申请注册机构 RA(Registration Authority),它是数字证书的申请注册、证书签发的管理机构。而在公司内网,通常也可以自己搭建认证服务器,发送证书,简称“自签发证书”。
公钥(Public-key):公共证书,由 CA 中心颁发的合法文件,可以在互联网传播。公钥证书文件的扩展名包括 crt、cer、key、der、pem、pem。公钥中包含颁发给哪个域名、公司名、加密算法、组织机构、有效期等信息。
私钥(private-key):即通常就叫所谓的私钥,私钥在生成 CSR 文件的时候同时生产,后缀通常为 .key,由使用者自己保管,不可在互联网传播,极其重要。
连接启用连接加密的实例
MySQL/MariaDB 客户端
使用 SSL 连接加密的方式连接数据库:
mysql -P 3306 -h 10.xx.xx.168 -u test -p --ssl
登录成功后,可以使用\s
命令查询当前登录状态:
其中SSL: Cipher in use is AES256-GCM-SHA384
表示该用户是使用 SSL 连接至 MySQL 服务器。
Navicat 等图形化客户端
直接选择【使用 SSL】,无需选择【使用验证】即可连接。
JDBC 等连接程序示例
如果实例开启 SSL 连接加密,但 JDBC&ODBC 没有配置 SSL 加密,业务会报 WARN 错误。
JDBC 连接串添加 useSSL 参数:
connection = DriverManager.getConnection("jdbc:mysql://ip:port/jsp_db?useSSL=true&verifyServerCertificate=false","root","123456");
也可以修改在 Properties 对象中设置 useSSL 的值:
properties.setProperty("useSSL", "true");
要显示指定使用 TLS1.2 协议,可以在启动 JVM 时传递下列选项:
-Djavax.net.debug=all -Djdk.tls.client.protocols="TLSv1.2" -Dhttps.protocols="TLSv1.2"