Mysql使用SSL连接
1.描述
项目部署时要求对数据库进行加密连接,需要用到SSL连接,记录一下。
首先在 MySQL 上执行如下命令, 查询当前版本的mysql是否支持 SSL:
show variables like '%ssl%';
- 当 have_ssl 为 YES 时, 表示此时 MySQL 服务已经支持 SSL 了.
- 如果是 DESABLE, 则需要在启动 MySQL 服务时, 使能 SSL 功能.
- 如果mysql版本过低,可能不支持SSL ,需要先更新mysql版本:
删除mysql服务参考链接:彻底卸载MySQL服务.
安装mysql服务参考链接:win10下mysql的下载、安装以及SSL配置超详解教程.
2.安装 OpenSSL
OPEN SSL下载链接: Win64OpenSSL-3_0_0.msi..
安装步骤:
- 下载放置到有效目录,点击Win64OpenSSL-3_0_0.msi进行安装:
- 选择目录:
- 点击‘finish’:
- 新增环境变量:
参考上述3.3节,新增环境变量:
变量名:OPENSSL_HOME
变量值:安装路径 D:\OpenSSL-Win64\OpenSSL-Win64
编辑path:在path最后添加 ;%OPENSSL_HOME%\bin;
- 验证安装是否成功:
cmd 命令行输入-> openssl
3. 使用 OpenSSL 创建 SSL 证书和私钥
3.1 修改mysql 的my.ini配置文件
到mysql的安装目录,找到my.ini文件,在文件中添加ssl证书文件位置配置:
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir="D:\mysql-5.7.28-winx64_withssl"
# 设置mysql数据库的数据的存放目录
datadir="D:\mysql-5.7.28-winx64_withssl/data"
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#skip-grant-tables
#需要开启ssl服务,才需要配置ssl文件路径
ssl-ca=D:\mysql-5.7.28-winx64_withssl/data/ca.pem
ssl-cert=D:\mysql-5.7.28-winx64_withssl/data/server-cert.pem
ssl-key=D:\mysql-5.7.28-winx64_withssl/data/server-key.pem
#【关闭ssl】
#skip_ssl
3.2 创建 SSL 证书和私钥
- 关闭mysql服务:
cmd - > net stop mysql
- 运行mysql_ssl_rsa_setup.exe:
进入mysql的bin目录,找到mysql_ssl_rsa_setup.exe,双击运行:
运行结束后,进入data目录,看到ssl文件(ssl文件位置在my.ini文件中配置指定):
ca-cert.pem: CA 证书, 用于生成服务器端/客户端的数字证书.
ca-key.pem: CA 私钥, 用于生成服务器端/客户端的数字证书.
server-key.pem: 服务器端的 RSA 私钥
server-req.pem: 服务器端的证书请求文件, 用于生成服务器端的数字证书.
server-cert.pem: 服务器端的数字证书.
client-key.pem: 客户端的 RSA 私钥
client-req.pem: 客户端的证书请求文件, 用于生成客户端的数字证书.
client-cert.pem: 客户端的数字证书.
则SSL配置成功。
3.3 验证是否连接成功
- 以管理员身份运行cmd,进入mysql的bin目录:
- 启动mysql服务,执行:
net start mysql
- 输入命令登录mysql:
mysql -uroot -p
- 执行:
show variables like '%ssl%';
此时可以看到ssl创建的证书和密钥文件。
4. 添加信任证书到java密钥库
- 命令行进入msql的data目录下:
D: -> cd D:\mysql-5.7.28-winx64_withssl\data - 执行命令:
keytool -importcert -file ca.pem -keystore truststore --storepass 库密码
执行:keytool -importcert -file ca.pem -keystore truststore --storepass math23456:
- 执行成功后,系统自动会在data目录下生成truststore库,供java jdbc 连接使用:
truststore文件中存储的证书库,供java jdbc 连接使用。
因此可以多个用户、连接使用同一个证书库,便于多人访问。
- 将另一个证书也导入这个证书库中,可执行命令:
keytool -importcert -alias "证书所属者名称" -file ‘ca的文件名称’ -keystore 证书库名称--storepass 库密码
- 查看证书库中已有的证书,可执行命令:
keytool -list -keystore ./证书库名称-storepass 库密码
如:
(1)添加自己的证书到证书库中,命名证书库文件为’ssl_truststore.gks‘,
执行命令:keytool -importcert -file ca.pem -keystore ssl_truststore.gks --storepass math123456
看此时的证书库的证书条目:
keytool -list -keystore ./ssl_truststore.gks -storepass math123456
结果如下:
(2)添加另一个人的证书到证书库中:
先将另一个人的ca.pem文件重命名(我这边的命名为:cui.pem),然后放置到data目录下;
然后执行命令:keytool -importcert -alias 'cuijian' -file cui.pem -keystore ssl_truststore.gks --storepass math123456
结果输出:
5. java 配置
- 将生成的文件配置系统环境变量:
名:JAVA_OPTS
值:-Djavax.net.ssl.trustStore=“上一步中生成文件的本地路径” -Djavax.net.ssl.trustStorePassword=“密码”
- JDBC配置连接时添加ssl:
jdbc.url=jdbc:mysql://127.0.0.1:3306/mydb?verifyServerCertificate=true&useSSL=true&requireSSL=true
- 在jdbc创建连接时指定truststore证书位置,如: