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 证书文件路径。