require_secure_transport = ON
ssl-ca = /var/lib/mysql/ca.pem
ssl-cert = /var/lib/mysql/server-cert.pem
ssl-key = /var/lib/mysql/server-key.pem
# ll /opt/mysqldata/*.pem
MySQL 开启SSL,客户端jdbc的几种设置
关于开启 MySQL SSL,客户端dbc的设置分以下几种情况:
1. 服务端开启SSL,配置证书,客户端连服务端,直接信任证书,不用配置证书
2. 服务端开启SSL,配置证书,客户端连服务端,配置单向验证
客户端或者服务端
证书
3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
MySQL Server端是 x509 的pem格式证书,怎么跟客户端的 java程序(要连MySQL,jks格式证书)建立证书认证关系?
x509 的 pem格式证书,可以通过转换,变成 jks格式证书。
1. 服务端开启SSL,配置证书,客户端连服务端,直接信任证书,不用配置证书
MySQL驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true
username=root
password=MySQL@123
MariaDB驱动
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&trustServerCertificate=true&requireSSL=true
username=root
password=MySQL@123
关于证书信任设置
MySQL: verifyServerCertificate=false
MariaDB: trustServerCertificate=true
当启用SSL加密并设置连接字符串属性trustServerCertificate=false 时需要做些什么,与设置trustServerCertificate=true 有什么区别?
如果当使用安全套接字层 (SSL) 对通信层加密时应自动信任服务器安全套接字层证书,则为“true” , 否则为 false。
此处,我们服务端,不设置证书验证,为自动信任服务器安全套接字层证书。
2. 服务端开启SSL,配置证书,客户端连服务端,配置单向验证客户端或者服务端证书
在 MySQL Server服务器上
# mkdir /root/mysqlSSL
# cp /opt/mysqldata/*.pem /root/mysqlSSL/
# keytool -importcert -alias
MySQLCACert
-file ca.pem
-keystore truststore.jks -storepass
Truststore@123
-noprompt
# keytool -v -list -keystore truststore.jks -storepass "Truststore@123"
将 truststore.jks拷贝到客户端 ,假设文件路径为
/opt/cert/truststore.jks
MySQL驱动
driverClassName=
com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&
verifyServerCertificate=true
&requireSSL=true
&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword=Truststore@123
username=root
password=MySQL@123
MariaDB驱动
driverClassName=
org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&
trustServerCertificate=false
&requireSSL=true
&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
当启用SSL加密并设置连接字符串属性trustServerCertificate=false 时需要做些什么,与设置trustServerCertificate=true 有什么区别?
如果当使用安全套接字层 (SSL) 对通信层加密时应自动信任服务器安全套接字层证书,则为“true” , 否则为 false。
此处,客户端务端设置了证书验证,通过连接字符串属性 clientCertificateKeyStoreUrl=file:/opt/cert/ truststore.jks 和 clientCertificateKeyStorePassword= "Truststore@123" 验证服务器安全套接字层证书。
3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
# keytool -importcert -alias
MySQLCACert
-file ca.pem -keystore truststore.jks -storepass
Truststore@123
-noprompt
# openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:Keystore@123 -out client-keystore.p12
# keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass "Keystore@123" -destkeystore keystore.jks -deststoretype JKS -deststorepass "Truststore@123"
# keytool -v -list -keystore
truststore.jks
-storepass "Truststore@123"
# keytool -v -list -keystore
keystore.jks
-storepass "Truststore@123"
# cat ca.pem
# keytool -export
-alias mysqlcacert
-keystore truststore.jks
--storepass "Truststore@123" -rfc
可以看出 ,实际上事将CA证书 ca.pem 导入到了 truststore.jks中。
# cat client-cert.pem
# keytool -export
-alias mysqlclient -keystore keystore.jks
--storepass "Truststore@123" -rfc
可以看出,实际是将 客户端证书 client-cert.pem 导入到了 keystore.jks中,当然也将 客户端私钥 client-key.pem 导入到了keystore.jks中,只是我们没法直接从 keystore.jks 获取私钥内容。
注意: 此处 file:///path/to/file 等价于 file:/path/to/file
将
truststore.jks 和 keystore.jks
拷贝到客户端 ,假设文件路径为
/opt/cert/truststore.jks /opt/cert/keystore.jks
MySQL驱动
driverClassName=
com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&
verifyServerCertificate=true
&useSSL=true&requireSSL=true&
clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="Keystore@123"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
MariaDB驱动
driverClassName=
org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&
trustServerCertificate=false
&useSSL=true&requireSSL=true&
clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="Keystore@123"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="Truststore@123"
username=root
password=MySQL@123
用“设置服务器身份验证”和“设置客户端身份验证”中概述的步骤,以建立双向双向身份验证过程,在该过程中,服务器和客户端在建立连接之前先对彼此进行身份验证。
尽管上述典型设置在两端都使用相同的CA证书进行相互身份验证,但并非必须如此。
唯一的要求是,在服务器中配置的CA证书必须能够验证客户端证书,并且导入到客户端信任库中的CA证书必须能够验证服务器证书。
两端使用的两个CA证书可以不同。
综上,我们可以看到:
客户端不做认证 ,直接信任证书,客户端无需配置证书
单向认证(验证服务端或客户端),客户端只需要配置 truststore.jks
(truststore-ca.jks或truststore-client.jks)
双向认证(验证客户端和者服务端), 客户端需要配置truststore.jks
(truststore-ca.jks)
和keystore.jks
setTrustServerCertificate 方法
https://docs.microsoft.com/zh-cn/sql/connect/jdbc/reference/settrustservercertificate-method-sqlserverdatasource?view=sql-server-2017
Steps to connect to an AWS RDS MySql server through SSL/TLS
https://developer.jboss.org/message/966980?_sscc=t
常用Keytool 命令
http://www.willrey.com/support/keytool_command.html
用keytool创建keystore和trustsotre文件
https://www.jianshu.com/p/1b1c9cfa17a4
配置过程中出现问题及解决方法
1、mysql ssl Keystore was tampered with, or password was incorrect,在配置url中加入
sslProtocol=TLS
2、密码不用加引号
参考:https://www.jianshu.com/p/5bc9a59dcf95MySQL 开启SSL# vim /opt/mysqlconfig/mysqld.cnf添加:require_secure_transport = ONssl-ca = /var/lib/mysql/ca.pemssl-cert = /var/lib/mysql/server-cert.pemssl-key ...
最近在
使用
Java的数据库
连接
池,那么C#针对Sql
Server
有没有数据库
连接
池呢?
首先我们需要一个数据库
连接
字符串,例如:"Data Source=
server
;Initial Catalog=test;User ID=sa;Password=123456;"
其实这个
连接
字符串的
配置
对应着一个类:System.Data.SqlClient.SqlConnectionStringBui
MsSql
Server
JdbcUrl encrypt、t
rust
Server
Certificate
、t
rust
Store、t
rust
StorePassword
一、停止运行
MySQL
服务
方法1.在cmd命令行中输入: net stop
mysql
; 这样就可以将
MySQL
服务停止。
方法2.在任务管理器里搜索“service”,进入找到
MySQL
服务,停止服务即可。
方法3.win+r快捷键,输入services.msc回车,进入服务列表,找到
Mysql
服务。
二
、以管理员身份打开cmd,并切换至
MySQL
的安装目录下的bin目录;开启跳过密码验证登录的
MySQL
服务:
1.输入:
mysql
d --console --skip-grant-tables --
配置
MySQL
使用
加密
连接
通过
MySQL
客户端和服务器之间的未加密
连接
,可以访问网络的人可以监视您的所有流量并检查客户端和服务器之间发送或接收的数据。
当您必须以安全的方式通过网络移动信息时,未加密的
连接
是不可接受的。要使任何类型的数据不可读,请
使用
加密。加密算法必须包含安全元素以抵御多种已知攻击,例如更改加密消息的顺序或重放数据两次。
MySQL
使用
TLS(传输层安全)协议支持客户端和服务器之间的加密
连接
。TLS 有时被称为
SSL
(安全套接字层),但
MySQL
实际上并不
使用
SSL
协
1:客户段与
MySQL
服务端之间,是否
使用
加密的
连接
,可以通过三个层次控制。影响范围依次缩小:
(1)服务端系统参数 require_secure_transport 开启的时候,强制要求所有客户端都是用加密
连接
。关闭的时候,允许加密和非加密的
连接
请求。默认是关闭的。
(2)创建用户的时候,
使用
REQUIRE 子句,指定此用户
连接
数据库的时候,必须
使用
加密
连接
。例如:
create user if not exists 'user01'@'%' identified by 'user01passwo
static final String JDBC_DRIVER = "com.
mysql
.jdbc.Driver";
static final String DB_URL = "jdbc:
mysql
://localhost:3306/test";
MySQL
8.0 以上版本 - JDBC 驱动名及数据库...
MySQL
8.0 支持
SSL
加密
连接
,可以
使用
SSL
/TLS 协议保证通信安全。以下是在
MySQL
8.0 中启用
SSL
的步骤:
1. 生成
SSL
证书和密钥文件。可以
使用
Open
SSL
工具生成,具体命令如下:
open
ssl
req -newkey rsa:2048 -nodes -keyout
server
-key.pem -out
server
-req.pem
open
ssl
rsa -in
server
-key.pem -out
server
-key.pem
open
ssl
x509 -req -in
server
-req.pem -days 365 -out
server
-cert.pem -signkey
server
-key.pem
以上命令会生成三个文件:
server
-key.pem(私钥文件)、
server
-req.pem(证书请求文件)、
server
-cert.pem(证书文件)。
2. 将证书和密钥文件复制到
MySQL
服务器的安全目录下。可以通过以下命令查看安全目录:
mysql
_
ssl
_rsa_setup --help
安全目录默认为 /var/lib/
mysql
-files,可以
使用
--datadir 选项指定。
3. 修改
MySQL
配置
文件,启用
SSL
。可以在 [
mysql
d] 段中添加以下
配置
:
ssl
-ca=/var/lib/
mysql
-files/
server
-cert.pem
ssl
-cert=/var/lib/
mysql
-files/
server
-cert.pem
ssl
-key=/var/lib/
mysql
-files/
server
-key.pem
以上
配置
指定了
SSL
使用
的证书和密钥文件路径。
4. 重启
MySQL
服务。可以
使用
以下命令重启服务:
systemctl restart
mysql
重启后,
MySQL
就会
使用
SSL
加密
连接
了。可以
使用
以下命令测试
SSL
连接
:
mysql
-u 用户名 -p -h 主机名 --
ssl
-ca=
server
-cert.pem
以上命令会
使用
SSL
连接
到
MySQL
服务器。注意需要指定 --
ssl
-ca 选项,指定 CA 证书文件路径。