如何通过SSL加密连接RDS MySQL | 您所在的位置:网站首页 › 怎么查看ssl证书 › 如何通过SSL加密连接RDS MySQL |
RDS MySQL的SSL(Secure Socket Layer)加密功能用于对传输中的数据进行加密,适用于增强RDS连接安全性或者满足安全合规等场景。 前提条件RDS MySQL实例系列和版本如下: 高可用系列:8.0、5.7、5.6 集群系列:8.0、5.7 基础版系列:8.0、5.7 说明您可以前往实例基本信息页面查看以上信息。 非Serverless基础系列实例转成Serverless基础系列实例,SSL需要再次开启。 符合上述条件的实例中,有部分实例会报错不支持SSL。如遇到该报错,请升级内核小版本后再重试。 功能介绍SSL加密功能可以对RDS MySQL和客户端之间传输的数据进行加密,防止数据被第三方监听、截取和篡改。 开启SSL加密后,客户端连接RDS MySQL时,可以选择进行加密连接或者非加密连接。 开启SSL加密时,RDS MySQL将生成服务器证书以及公私钥。 在加密连接的建立过程中,RDS MySQL会发送服务器证书(包含公钥)给客户端,客户端用收到的公钥加密生成的对称密钥,只有RDS MySQL有私钥能够解密该对称密钥,RDS MySQL和客户端将使用该对称密钥对通信数据进行加密和解密,从而保证通信的机密性。客户端还可以使用CA证书验证收到的服务器证书以确认RDS MySQL身份,防止中间人攻击。 RDS MySQL实例支持的SSL链路加密配置及功能对比如下: 对比项 配置云端证书 获取方式 配置数据库云端证书 由证书认证机构发或自签名证书颁发 证书有效期 365天 由您自定义 保护的连接地址数 1个 1个 证书作用 开启SSL链路加密,客户端验证服务端真伪。 开启SSL链路加密,客户端验证服务端真伪。 影响开启SSL加密、关闭SSL加密、更新证书(MySQL 5.6、5.7版本)会重启实例,RDS服务会出现实例切换,建议在业务低峰期操作,并确保您的应用有自动重连机制,自动重连需要在您的应用侧代码中设置。MySQL 8.0版本更新证书不会重启实例。实例切换的影响请参见实例切换的影响。 开启SSL加密后,建立加密连接会显著增加CPU使用率。建议您仅在外网链路有加密需求的时候采用SSL加密,内网链路相对较安全,一般无需对链路加密。 TLS 版本说明TLS(Transport Layer Security)是一种被广泛采用的传输层安全性协议,用来保障互联网通信的私密性和数据安全性。TLS协议有很多版本,RDS MySQL不同大版本对TLS的支持情况如下: RDS MySQL版本 TLSv1.0 TLSv1.1 TLSv1.2 TLSv1.3 8.0 支持 支持 支持 支持 (自20221231版本起) 5.7 支持 支持 支持 不支持 5.6 支持 支持 支持 不支持 说明TLSv1.0和TLSv1.1已经在2021年被IETF废弃( RFC8996),出于安全性考虑,推荐使用TLSv1.2及以上的TLS协议进行安全通信。 ssl_cipher默认配置说明RDS MySQL使用OpenSSL实现TLS的安全通信。RDS MySQL在5.7的20230831和8.0的20230930版本中,升级了OpenSSL版本到3.0,此版本默认不再支持通过TLSv1.0和TLSv1.1进行通讯(详见OpenSSL官方文档)。 出于兼容性考虑,RDS MySQL通过调整ssl_cipher参数默认值为 "ALL:@SECLEVEL=0" ,恢复了对TLSv1.0和TLSv1.1的支持。 如果您的业务确认只使用TLSv1.2及以上版本的TLS协议,建议您在RDS控制台设置ssl_cipher参数为 ""(空串),以获得更高的安全级别保障。 步骤一:为RDS MySQL开启SSL加密访问RDS实例列表,在上方选择地域,然后单击目标实例ID。在左侧导航栏单击数据安全性。 在SSL页签下,单击未开通前面的滑块开关。 说明如果没有找到SSL页签,请重新确认本文的前提条件。 在弹出的对话框中选择要开通SSL加密的地址,单击确定,开通SSL加密。 您可以根据需要,选择加密内网链路或者外网链路,但只可以选择一条链路。 开通SSL加密需要约1分钟,您可以手动刷新页面查看实例状态。 步骤二:下载CA证书开启云端证书后,RDS MySQL数据库提供数据库CA证书供您下载,当您通过客户端远程连接RDS MySQL数据库时,使用数据库CA证书可以对数据库真伪进行校验。 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。单击左侧导航栏数据安全性,在SSL页签下,单击下载CA证书。 下载的文件为压缩包,包含如下三种CA文件: PEM文件:适用于绝大部分场景。 JKS文件:PEM格式CA证书通常需要导入到truststore,即转换为JKS文件才能在Java中使用。您可以在Java程序中使用此JKS文件,密码为apsaradb。 p7b文件:适用于少数要求PKCS #7证书文件的Windows应用。 步骤三:从客户端连接RDS MySQL开启SSL加密后,客户端和RDS MySQL之间的连接是否加密与客户端的类型和设置有关。例如,客户端可能默认采用加密连接。您可以修改客户端的设置或代码,要求建立加密连接以及验证RDS MySQL的身份。 命令行对于MySQL 5.7.11及以后版本的客户端,在连接命令中添加--ssl-mode选项可以设置SSL加密。 说明对于MariaDB客户端以及MySQL 5.7.11之前的客户端,请使用--ssl和--ssl-verify-server-cert等选项。具体请参见MariaDB和MySQL官方文档。 --ssl-mode=DISABLED表示连接不加密。 --ssl-mode=PREFERRED或者不添加--ssl-mode选项,表示尝试加密连接,如果无法加密则采用非加密连接。 --ssl-mode=REQUIRED,表示必须加密连接,如果无法加密则连接失败。 --ssl-mode=VERIFY_CA,表示必须加密连接,并用本地的CA证书验证服务器证书是否有效。 --ssl-mode=VERIFY_IDENTITY,表示必须加密连接,并用本地的CA证书验证服务器证书是否有效,并验证服务器证书的主机名或IP地址是否与实际连接的主机名或IP地址匹配。 示例一:尝试加密连接,如果无法加密则采用非加密连接。 mysql -h {RDS连接地址} -u {RDS账号} -p --ssl-mode=PREFERRED示例二:要求加密连接,并验证服务器证书的有效性。 mysql -h {RDS连接地址} -u {RDS账号} -p --ssl-mode=VERIFY_CA --ssl-ca={CA证书路径}/ApsaraDB-CA-Chain.pem说明上述示例里的{RDS连接地址}、{RDS账号}和{CA证书路径}需替换为实际的值。 更多关于--ssl-mode选项的说明,请参见MySQL官方文档。 MySQL Workbench打开MySQL Workbench,选择Database > Manage Connections。 填写RDS连接地址和账号密码。 在SSL页签下,设置Use SSL参数,指定SSL CA File为下载的PEM格式CA证书,然后单击Test Connection或者OK。 关于Use SSL参数的选项,可以参考命令行连接方式的--ssl-mode说明。 DMS在DMS中录入RDS MySQL实例时,可设置开启SSL参数。具体操作,请参见云数据库录入。 也可以在已录入的实例上右键,选择编辑实例,然后在高级信息中设置。 应用程序代码JavaConnector/J(mysql-connector-java)是MySQL官方提供的JDBC驱动程序。本示例使用mysql-connector-java 8.0.19版本作为依赖。 mysql mysql-connector-java 8.0.19 说明以下示例代码使用sslMode属性指定SSL模式。mysql-connector-java从8.0.13版本开始支持该属性,如果您使用更早的版本,则需要改为使用useSSL、requireSSL和verifyServerCertificate属性,具体请参见MySQL文档。 示例代码: package com.aliyun.sample; import com.mysql.cj.jdbc.MysqlDataSource; import java.sql.Connection; import java.sql.SQLException; public class Sample { public static void main(String[] args) { Connection conn = null; MysqlDataSource mysqlDS=null; try{ mysqlDS = new MysqlDataSource(); //可按需设置SslMode。关于该属性的选项,请参见命令行连接方式的说明。 mysqlDS.setSslMode("VERIFY_IDENTITY"); //truststore用于存储CA证书,这里设置truststore类型为JKS。 mysqlDS.setTrustCertificateKeyStoreType("JKS"); // 请将file:/后面的路径改为您的ApsaraDB-CA-Chain.jks文件的路径。 mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks"); // 下载的JKS文件的密码为apsaradb,不能修改。 mysqlDS.setTrustCertificateKeyStorePassword("apsaradb"); // 您的数据库连接串 mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com"); // 您的数据库端口 mysqlDS.setPort(3306); // 您的数据库账号 mysqlDS.setUser("xxxxxx"); // 您的数据库密码 mysqlDS.setPassword("xxxxxx"); // 您的数据库名 mysqlDS.setDatabaseName("xxxxxx"); conn = mysqlDS.getConnection(); }catch(Exception e){ e.printStackTrace(); } finally { try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }Python# 安装pymysql pip install pymysql import pymysql try: ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # ca为证书的路径,mode为ssl-mode conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config) cursor = conn.cursor() cursor.execute('select version()') data = cursor.fetchone() print('Database version:', data[0]) cursor.close() except pymysql.Error as e: print(e)更多操作更新服务器证书RDS MySQL服务器证书有效期为1年,证书到期后不更新,会导致使用加密连接的客户端程序无法正常连接实例。即将到期时,阿里云将会通过短信、邮件、站内信(事件中心)的方式进行提醒,并会在特定时间段自动更新该证书。您可以通过配置计划时间配置自定义证书更新时间。更多信息,请参见计划内事件。您也可以通过以下方式手动更新服务器证书的有效期。 说明服务器证书自动更新后,使用加密连接的客户端程序无需重新下载和配置CA证书即可正常连接数据库。 重要MySQL 8.0版本更新证书不会重启实例,MySQL 5.6、5.7版本更新证书会重启实例。 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。在左侧导航栏单击数据安全性。 选择SSL页签,单击更新有效期。 查看连接加密情况查看当前会话使用的密码套件。如果返回的Value不为空,表示当前连接是加密的。 SHOW STATUS LIKE 'Ssl_cipher';查看当前会话使用的SSL/TLS版本。 SHOW STATUS LIKE 'Ssl_version';如果是MySQL命令行,还可以执行\s来查看当前连接是否加密。如果当前为加密连接,返回的SSL值为当前使用的密码套件。 强制加密连接设置服务端只允许加密连接 目前不支持。 设置客户端只允许加密连接 以命令行为例,在连接命令中设置SSL模式为REQUIRED、VERIFY_CA或VERIFY_IDENTITY,表示只允许加密连接,如果无法加密,则连接失败。 设置特定用户只允许加密连接 例如,以下命令用于设置testuser账号只允许加密连接。 ALTER USER 'testuser'@'%' REQUIRE SSL;查看CA证书内容执行以下命令可以查看CA证书的内容。 openssl x509 -in {CA证书路径}/ApsaraDB-CA-Chain.pem -text关闭SSL加密重要关闭SSL加密会重启RDS实例,系统会触发主备切换降低影响,但仍建议您在业务低峰期操作。 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。在左侧导航栏单击数据安全性。 选择SSL标签页。 单击已开通前面的开关,在弹出的提示框中单击确定。 常见问题功能咨询Q1:如何实现双向验证?即除了验证服务端身份,也验证客户端身份。 A:RDS MySQL目前不支持在SSL握手时验证客户端身份。您可以通过白名单设置、账号管理来实现访问控制。 Q2:如何加密读写分离地址? A:请参见设置代理SSL加密。 故障排查Java程序连接报错Javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints jdk7和jdk8若不修改jdk安全配置,可能会报此错误,其他类似报错,一般也都由Java安全配置导致。 需要修改默认的jdk安全配置,在应用程序所在主机的jre/lib/security/Java.security文件中,修改如下两项配置: jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224 jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024Java程序连接报错javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) Connector/J 8.0.18或更早版本连接到MySQL 5.6或5.7时,因为兼容性原因禁用了TLS 1.2和更高版本。您可以通过以下任一方式解决该问题。 使用Connector/J 8.0.19或更高的版本。 升级至RDS MySQL 8.0版本。 在代码中指定TLS版本,例如指定enabledTLSProtocols或tlsVersions属性值为TLSv1.2。 相关APIDescribeDBInstanceSSL - 查询RDS实例的SSL配置 ModifyDBInstanceSSL - 修改RDS实例的SSL配置 |
CopyRight 2018-2019 实验室设备网 版权所有 |