mysql使用jdbc连接增加ssl认证
1.创建用户并指定ssl连接
grant all on . to 'imooc'@'%' identified by 'imooc require SSL;
2.查看是否使用ssl
SELECT ssl_type From mysql.user Where user="imooc"
3.配置用户必须使用ssl
ALTER USER 'imooc'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
注意:%号位置可以更换为连接数据库的ip
4.取消用户使用ssl连接
update user set ssl_type='' where user='imooc';
FLUSH PRIVILEGES;
5.导入证书
使用jdk自带的keytool导入mysql的客户端证书到密钥仓库,并生成密钥文件。
根据上文查到的ca.pem,将其复制到目标主机上,然后执行下述指令
keytool -import -trustcacerts -v -alias Mysql -file "C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem" -keystore "mysql.ks"
设置密钥并记住密钥
导入成功后
#1: ObjectId: 2.5.29.19 Criticality=true //这里为true
BasicConstraints:[
CA:true //这里为true
PathLen:2147483647
注意:C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem为ca证书的路径,mysql
6.验证证书是否导入
keytool -list -keystore mysql.ks
导入成功后:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mysql, 2022-2-23, trustedCertEntry,
证书指纹 (SHA1): CB:E2:5C:87:4E:93:62:8F:97:F9:7A:4B:0C:F3:6D:4D:63:DB:52:AB
7.将证书放在目标服务器或者http服务器,更改mysql驱动和连接配置
driverClassName=com.mysql.cj.jdbc.Driver
"jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/mysql.ks
注意:124.222.101.203为数据库服务器地址,trustCertificateKeyStorePassword=你设置的密钥,trustCertificateKeyStoreUrl=当前服务器可访问到证书的地址,useSSL=true,verifyServerCertificate=true代表需要客户端密钥库和信任库
8.数据库加密,客户端不使用证书
jdbc:mysql://124.222.101.203:3306/imooc?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true",
注意:verifyServerCertificate=false不需要验证客户端密钥
9.数据库加密,客户端服务端双向验证(建立在数据库开启ssl认证并且生成服务端和客户端证书)
设置服务器身份验证:导入服务器证书
keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass 123456
设置客户端身份验证:
将客户端密钥和证书文件转换为 PKCS #12 存档:(在数据库服务器生成)
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:123456 -out client-keystore.p12
将客户端密钥和证书导入 Java 密钥库:
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore keystore.jks -deststoretype JKS -deststorepass 123456
java数据库连接字符串:
"jdbc:mysql://124.222.101.203:3306/imooc?"
+ "useSSL=true"
+ "&verifyServerCertificate=true"
+ "&requireSSL=true"
+ "&trustCertificateKeyStoreUrl=file:D:/ssl.132/truststore.jks"
+ "&trustCertificateKeyStorePassword=mypassword"
+ "&clientCertificateKeyStoreUrl=file:D:/ssl.132/keystore.jks"
+ "&clientCertificateKeyStorePassword=mypassword",
注意:123456为密码
10.导入jks证书
使用jdk自带的keytool导入mysql的客户端证书到密钥仓库,并生成密钥文件。
根据上文查到的ca.pem,将其复制到目标主机上,然后执行下述指令
keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass 123456 -noprompt
注意:123456为密码,ca.pem可替换为路径
11.验证证书是否导入
keytool -v -list -keystore truststore.jks -storepass "123456"
导入成功后:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mysql, 2022-2-23, trustedCertEntry,
证书指纹 (SHA1): CB:E2:5C:87:4E:93:62:8F:97:F9:7A:4B:0C:F3:6D:4D:63:DB:52:AB
12.将证书放在目标服务器或者http服务器,更改mysql驱动和连接配置
注意:mysql连接驱动为mysql-connect-8.0.16以上版本,8.0.16以下版本使用ssl连接会出现日志报错问题,需升级解决
driverClassName=com.mysql.cj.jdbc.Driver
"jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/truststore.jks
注意:124.222.101.203为数据库服务器地址,trustCertificateKeyStorePassword=你设置的密钥,trustCertificateKeyStoreUrl=当前服务器可访问到证书的地址,useSSL=true,verifyServerCertificate=true代表需要客户端密钥库和信任库
13.useSSL=false和true的区别:
SSL(Secure Sockets Layer 安全套接字协议),在mysql进行连接的时候,如果mysql的版本是5.7之后的版本必须要加上useSSL=false,mysql5.7以及之前的版本则不用进行添加useSSL=false,会默认为false,一般情况下都是使用useSSL=false,尤其是在将项目部署到linux上时,一定要使用useSSL=false!!!,useSSL=true是进行安全验证,一般通过证书或者令牌什么的,useSSL=false就是通过账号密码进行连接,通常使用useSSL=false!!!
14.附上jdbc连接mysql数据库的代码:
//mysql使用ssl方式jdbc连接数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
* 标准JDBC操作五步骤
public class StandardJDBCSample {
public static void main(String[] args) {
Connection conn = null;
try {
//1. 加载并注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 创建数据库连接
conn = DriverManager.getConnection(
//无需证书: "jdbc:mysql://124.222.101.203:3306/imooc?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true",
//客户端证书 "jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/mysql.ks",
//客户端证书 "jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStorePassword=Truststore@123&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/truststore.jks",
"jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=true",
"imooc", "imooc"
//3. 创建Statement对象
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from employee where dname='市场部'");
//4. 遍历查询结果
while (rs.next()) {
Integer eno = rs.getInt(1); //eno
String ename = rs.getString("ename");
Float salary = rs.getFloat("salary");
String dname = rs.getString("dname");
System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if (conn != null && conn.isClosed() == false) {
//5. 关闭连接,释放资源
conn.close();
}catch(Exception ex){
ex.printStackTrace();
15.数据库sql文件和jar包的链接:
链接:https://pan.baidu.com/s/1OmlrnE3ii58rtzdVl91Y7g
提取码:6yo2