背景描述
为了提高RDS MySQL的链路安全性,可以启用SSL(Secure Sockets Layer)加密,并安装SSL CA证书到需要的应用服务。SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。
SSL在部署和使用过程,易出现各种问题,本文就个人经验介绍一下MySQL SSL常见问题。
SSL技术简单介绍
SSL技术优点
- 机密性:SSL协议使用密钥加密通信数据。
- 可靠性:服务器和客户都会被认证,客户的认证是可选的。
- 完整性:SSL协议会对传送的数据进行完整性检查。
工作原理
流程图
SSL握手流程
- 客户端向服务器发送Client Hello,信息包含:SSL协议号、加密算法、随机数,等信息。
- 服务端向客户端发送Server Hello,信息包含:SSL协议号、加密算法、随机数和自已的公钥等。数据进行签名。
- 客户端检证证书是否过期,CA是否可靠,并用公钥进行验证签名是否正确。
- 客户端生成对称密钥,并用公钥进行加密,回传给服务端。用于后续加密。(对称加密比非对称加密省资源)
- 如果(在握手过程中可选)服务端要求验证客户身份,客户会生成一个随机数,然后进行签名,并将签名随机数和自己的证书传送给服务器。
- 同4步,服务器验证客户端的证书和签名信息等。
- 服务器和客户端使用相同的主密码进行通信。同时还要验证通信过程中的完整性。
- 客户端向服务器发出信息,指明使用对称密钥进行加密,同时告知服务器握手结束。
- 服务器向客户端发出信息,指明使用对称密钥进行加密,同时告知客户端握手结束。
- 同7步,SSL 握手结束。
抓包查看SSL握手流程
通过抓包,可以看来客户端与服务端进行建议SSL连接的整过过程。
如何开通RDS MySQL SSL功能
开启SSL加密
RDS MySQL是支持SSL功能,但需要在控制台开启,具体如何操作需要参考设置SSL加密文档。
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
- 在左侧导航栏单击数据安全性。
- 单击未开通前面的滑块开关。
- 在弹出的对话框中选择要开通SSL加密的地址,单击确定,开通SSL加密。
如截图:
如何在JAVA程序中配置SSL
使用MySQL SSL连接数据库测试样例:
importjava.sql.*; importjava.util.Properties; publicclassMySQLSSL { publicstaticvoidmain(String[] args) { StringconnectionUrl="jdbc:mysql://******.mysql.rds.aliyuncs.com:3306/db01"; Propertiesproperties=newProperties(); properties.setProperty("user","****"); properties.setProperty("password","*****"); properties.setProperty("useSSL","true"); properties.setProperty("trustCertificateKeyStoreUrl","file:/Users/*****/Downloads/ApsaraDB-CA-Chain/ApsaraDB-CA-Chain.jks"); properties.setProperty("trustCertificateKeyStorePassword","apsaradb"); ResultSetresultSet; try (Connectionconnection=DriverManager.getConnection(connectionUrl,properties); Statementstatement=connection.createStatement()) { StringselectSql="SELECT * FROM t1 limit 1"; //输入希望执行的SQL。resultSet=statement.executeQuery(selectSql); while (resultSet.next()) { System.out.println(resultSet.getString("id")); } } catch (SQLExceptione) { e.printStackTrace(); } } }
说明:
- trustCertificateKeyStoreUrl:指定Server端 CA证书的路径
- trustCertificateKeyStorePassword:指定Server端CA证书的密码
- 阿里云RDS MySQL CA证书都是一样的,所以不同的实例基本上都是使用相同的CA证书
常见问题
- 为什么出现报错信息:WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
解答:
- 不建议没有使用server ca 证书进行验证就使用SSL连接。
- 在适当的版本,服务端开启SSL,客户端默认就是通过SSL连接的。
- 若不使用SSL连接,将verifyServerCertificate属性设置为false。
- 可以通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并且要提供服务器证书验证。
解决方案:
- 连接字符串,添加useSSL=false选项,禁用SSL,就不会出现警告。
- java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
解决方案:
- 这个报错,是指定了useSSL=true ,但是没有指定服务器证书路径。
- 需要添加trustCertificateKeyStoreUrl和trustCertificateKeyStorePassword选项