如何配置MySQL SSL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置MySQL SSL相关的知识,希望对你有一定的参考价值。

mysql默认的数据通道是不加密的,在一些安全性要求特别高的场景下,我们需要配置MySQL端口为SSL,使得数据通道加密处理,避免敏感信息泄漏和被篡改。
当然,启用MySQL SSL之后,由于每个数据包都需要加密和解密,这个对MySQL的性能是有不小影响的,读者们在使用的时候,要根据实际情况斟酌。

MySQL客户端登录服务器时候的密码不是明文传输,有加密策略处理。

笔者是在 ubuntu12.04 系统上使用MySQL 5.5版本测试的,其他环境请读者自行匹配。

配置MySQL服务器证书

编辑 /etc/mysql/my.cnf 文件
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

把上面三行默认证书配置注释打开,使用自己的证书。笔者就使用上次在搭建自己的CA服务 – OpenSSL CA 实战文章中生成的证书
ssl-ca=/home/yunweipai/user_certs/ca_cert.cer
ssl-cert=/home/yunweipai/user_certs/web.cer
ssl-key=/home/yunweipai/user_certs/web_key_plain.pem

这里需要注意的是,在ubuntu上,配置证书后如果不生效,参考这里解决方法

注意上面配置的 web_key_plain.pem 文件,由于MySQL不支持加密后的私钥,因此我们使用命令
openssl rsa -in web_key.pem -passin pass:Yunweipai@123 -out web_key_plain.pem

将私钥解密。MySQL不支持私钥加密的原因是从安全性角度考虑,因为如果要用户传递一个加密的私钥,那么必须要用户传密码,那么MySQL怎么存储这个密码呢?这就引出了我们在密码存储和传输的安全建议里面提到的一系列问题了。
所以MySQL为了简化实现,就不支持私钥加密。

指定客户端连接方式

MySQL服务端在对客户端授权的时候,可以通过选项指定客户端连接MySQL 服务器的SSL级别,参考MySQL赋权的 REQUIRE值:
ssl_option
SSL: 不认证客户端,客户端不需要提供证书
X509: 客户端必须发送一个有效的X509证书
issuer: 客户端的证书是否是服务器所配置的CA颁发的(在我们场景下是ca_cert.cer颁发的证书)
subject: 认证证书的subject(关于证书的subject在之前的文章有介绍)
cipher: 指定加密算法
这些选项可以叠加使用,如:X509|issuser

客户端连接(SSL方式)

mysql 客户端连接
mysql -u root -pChangeme_123 -P 3306 --ssl-ca=/home/yunweipai/user_certs/ca_cert.cer
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 36
Server version: 5.5.43-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type \'help;\' or \'\\h\' for help. Type \'\\c\' to clear the current input statement.

mysql> \\s
--------------
mysql Ver 14.14 Distrib 5.5.43, for debian-linux-gnu (i686) using readline 6.2

Connection id: 36
Current database:
Current user: root@localhost
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: \'\'
Using delimiter: ;
Server version: 5.5.43-0ubuntu0.12.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 29 sec

Threads: 1 Questions: 109 Slow queries: 0 Opens: 48 Flush tables: 1 Open tables: 41 Queries per second avg: 3.758
--------------

JDBC连接

在jdbc字符串中增加下面参数
useSSL=true&verifyServerCertificate=false
这么就不需要客户端配置证书了,配置就简单很多。因为mysql本身有账号口令认证,因此不需要证书认证。
参考技术A

MySQL默认的数据通道是不加密的,在一些安全性要求特别高的场景下,我们需要配置MySQL端口为SSL,使得数据通道加密处理,避免敏感信息泄漏和被篡改。


当然,启用MySQL SSL之后,由于每个数据包都需要加密和解密,这个对MySQL的性能是有不小影响的,读者们在使用的时候,要根据实际情况斟酌。

Windows下如何配置MySQL SSL安全传输:

1、首先明确你的MySQL版本是否支持或是否开启SSL:show global variables like 'have_%ssl';


2、确认OpenSSL安装并加入PATH系统路径环境变量。


3、正确创建号证书。


4、通过my.cnf或者命令行在mysql启动的时候加载证书配置,例如:
mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem。


5、客户端连接时同样要记得加载证书。

配置spring通过ssl连接mysql

【中文标题】配置spring通过ssl连接mysql【英文标题】:Configure spring to connect to mysql over ssl 【发布时间】:2012-12-25 06:21:34 【问题描述】:

我正在从我的 Java 应用程序通过 SSL 连接到 MySQL。我已将 MYSQL 配置为支持 SSL 并生成客户端证书。我已将服务器 CA 证书和客户端证书导入密钥库。这就是我的代码目前的样子

    String url = "jdbc:mysql://127.0.0.1:3306/MySampleDb? verifyServerCertificate =true&useSSL=true&requireSSL=true"

    System.setProperty("javax.net.ssl.keyStore","/home/cert/keystore");
    System.setProperty("javax.net.ssl.keyStorePassword","password");
    System.setProperty("javax.net.ssl.trustStore","/home/cert/truststore");
    System.setProperty("javax.net.ssl.trustStorePassword","password");

    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(url, user, password);

我想使用带有 C3p0 的 spring 通过 SSL 连接到 MYSQL。这是我的 spring 配置文件,它从 jdbc.properties 读取参数。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="$jdbc.driver"/>
    <property name="jdbcUrl" value="$jdbc.url"/>
    <property name="user" value="$jdbc.username"/>
    <property name="password" value="$jdbc.password"/>
    ........
</bean>

如何配置spring来设置属性 verifyServerCertificate =true 使用SSL=true 要求SSL=true" 也可以在 spring 配置文件中设置 keyStore 和 trustStore 值。

【问题讨论】:

【参考方案1】:

jdbc.properties 中jdbc.url 的值必须为

jdbc:mysql://127.0.0.1:3306/MySampleDb?verifyServerCertificate=true&useSSL=true&requireSSL=true

这些参数必须直接添加到 MySQL 的 URL。 keyStoretrustStore 的参数应该在启动时传递给 JVM,如下所示:

-Djavax.net.ssl.keyStore=path_to_keystore_file
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=path_to_truststore_file
-Djavax.net.ssl.trustStorePassword=password

可以use Spring to set system properties但我永远不会使用它,它太麻烦了。

【讨论】:

【参考方案2】:

不必将keyStoretrustStore 传递给java 程序或设置任何系统属性,因为它可以通过每个连接的连接属性来实现!

因此,您可以为不同的连接使用不同的证书(如果您在应用服务器中,还可以使用不同的应用程序)。

原答案:https://***.com/a/51879119/173149相关部分:

jdbc:mysql://example.com:3306/MYDB?verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:cert/keystore.jks&clientCertificateKeyStorePassword=123456&trustCertificateKeyStoreUrl=file:cert/truststore.jks&trustCertificateKeyStorePassword=123456

记录在案:

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-using-ssl.html

【讨论】:

【参考方案3】:

您可以使用基于 Java 的配置来配置 DataSourceuseSSlrequireSSLverifyServerCertificate 属性。 DataSource 类的addDataSourceProperty 方法为您提供了能力,如下面的代码 sn-p 所示(您可以将 HikariDataSource 替换为 C3p0 实例)

MySQL Connector/J 公开了密钥存储的配置属性(例如trustCertificateKeyStoreUrl),所以我假设addDataSourceProperty 也可以用于这些属性。

不知道XML配置架构是否提供了对应addDataSourceProperty的标签。

public DataSource createPslDataSource(final MyDataSourceProperties myDataSourceProperties) 

    HikariDataSource dataSource = new HikariDataSource();

    dataSource.addDataSourceProperty("useSSL", true);
    dataSource.addDataSourceProperty("requireSSL", true);
    dataSource.addDataSourceProperty("verifyServerCertificate", true);

    dataSource.setJdbcUrl(myDataSourceProperties.getJdbcUrl());
    dataSource.setUsername(myDataSourceProperties.getUsername());
    dataSource.setPassword(myDataSourceProperties.getPassword());

    return dataSource;

【讨论】:

以上是关于如何配置MySQL SSL的主要内容,如果未能解决你的问题,请参考以下文章

如何正确的配置ssl证书,配置ssl有哪些好处

如何在 nginx 中使用动态 SSL 配置配置动态虚拟主机?

如何将 WCF 配置为接受 SSL 和非 SSL

Mysql配置ssl证书

如何在 Spring Boot / Spring Data 中为 Amazon RDS Mysql 启用 SSL?

nginx下如何配置 ssl证书?腾讯云ssl证书为例!