一、Mysql8配置SSL
可以首先参考文章: 启动MySQL。并查看SSL连接状态。
show global variables like '%ssl%';
5,查看查看SSL的加密方式
二、创建用户SSL/TLS选项
对于帐户REQUIRE X509,客户必须指定连接–ssl-key 和–ssl-cert选项。(建议但不要求 --ssl-ca也要指定,以便可以验证服务器提供的公共证书。)这是正确的ISSUER ,SUBJECT因为这些 REQUIRE选项意味着要求X509。blog.51cto.com/moerjinrong…
- 使用X509对于语句指定的所有帐户,要求客户端提供有效证书,但确切的证书,颁发者和主题无关紧要。唯一的要求是应该可以使用其中一个CA证书验证其签名。使用X.509证书始终意味着加密,
# 创建用户使用x509认证
create user usessl@'%' identified by '123456' require x509
# 授权所有权限和地址访问
grant all on *.* to "usessl"@"%" with grant option;
# 刷新
flush privileges;
### 登录验证(必须使用证书)
mysql -u usessl -p -h127.0.0.1 --ssl-ca=/data/mysql/ca.pem --ssl-cert=/data/mysql/client-cert.pem --ssl-key=/data/mysql/client-key.pem
- 强制ssl验证,即使设置了强制ssl,在登录时候使用--ssl-mode=disable依然可以避开ssl验证
# 服务端开启SSL,客户端强制SSL连接
CREATE USER 'test'@'%' identified by '123456' require SSL;
# 授权
grant all on *.* to "test"@"%" with grant option;
# 刷新
flush privileges;
- 不使用ssl验证
# 服务端开启SSL,客户端强制SSL连接
CREATE USER 'test2'@'%' identified by '123456' require none;
# 授权
grant all on *.* to "test2"@"%" with grant option;
# 刷新
flush privileges;
三、JDBC数据库连接
3.1、生成TrustStroe
# 将ca证书导入, 生成truststore.jks
keytool -import -alias mysqlCACert -file ca.pem -storepass huawei -keystore truststore.jks
数据库连接如下
datasource.masterUrl=jdbc:mysql://127.0.0.1:3306/ei_app?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:E:/2022mycomputer/mysql_cert/truststore&trustCertificateKeyStorePassword=123456
参数说明:
| 参数 | 说明 |
|---|---|
| useSSL | 是否建立SSL连接 |
| verifyServerCertificate | 是否需要检验Mysql服务器证书 |
| requireSSL | SSL连接,如果Mysql服务器不支持会失败 |
| sslMode | SSL的连接模式 |
| trustCertificateKeyStoreUrl | truststore密钥库文件 |
| trustCertificateKeyStorePassword | truststore密钥库口令 |
配置完成之后再使用对应ca.pem证书的账户密码即可以正常连接Mysql了 参考博客:其中第一篇博客是最有效的
private static void testSSL() {
try {
// mysql 5
// Class.forName("com.mysql.jdbc.Driver").newInstance();
// mysql 8
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
// 1.服务端开启SSL,客户端强制SSL连接
// ALTER USER 'u1'@'192.168.5.1' REQUIRE SSL;
// String url = "jdbc:mysql://192.168.5.132:3306/test?"
// + "useSSL=true"
// + "&verifyServerCertificate=false"
// + "&requireSSL=true";
// 2. 服务端开启SSL,验证服务端证书
// ALTER USER 'u1'@'192.168.5.1' REQUIRE SSL;
// String url = "jdbc:mysql://192.168.5.132:3306/test?"
// + "allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true"
// + "&useSSL=true"
// + "&verifyServerCertificate=true"
// + "&requireSSL=true"
// + "&trustCertificateKeyStoreUrl=file:D:/dev/mysql/ssl.132/truststore.jks"
// + "&trustCertificateKeyStorePassword=mypassword";
// 3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
// ALTER USER 'u1'@'192.168.5.1' REQUIRE X509; // 如果配置为X509,必须使用以下方式连接mysql
String url = "jdbc:mysql://10.118.29.27:3306/test?"
+ "useSSL=true"
+ "&verifyServerCertificate=true"
+ "&requireSSL=true"
+ "&trustCertificateKeyStoreUrl=file:D:/https/mysql/truststore.jks"
+ "&trustCertificateKeyStorePassword=huawei"
+ "&clientCertificateKeyStoreUrl=file:D:/https/mysql/keystore.jks"
+ "&clientCertificateKeyStorePassword=huawei";
String user = "usessl";
String password = "123456";
四、华为云Mysql SSL配置
4.1、华为云开启SSL加密
- 登录管理控制台。
- 单击管理控制台左上角的
- 单击页面左上角的
- 在“实例管理”页面,选择指定的实例,单击实例名称。
- 在“基本信息”页面,在“数据库信息”模块的“SSL”处,单击
- 在弹出框中,单击“确定”,开启SSL加密。
- 稍后可在“基本信息”页面,查看到SSL已开启。
4.1、Java配置
public class JDBCTest {
static final String USER = "root";
static final String PASS = "xxxx";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
String url = "jdbc:mysql://123.249.91.86:3306/koomap? " +
"requireSSL=true&useSSL=true&verifyServerCertificate=true&" +
"trustCertificateKeyStoreUrl=file:/Users/huanghe/SSL/Certificate Download/trust.jks&" +
"trustCertificateKeyStorePassword=huawei";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url,USER,PASS);
stmt = conn.createStatement();
String sql = "show status like 'ssl%'";
ResultSet rs = stmt.executeQuery(sql);
int columns = rs.getMetaData().getColumnCount();
for (int i = 1;i <= columns;i++){
System.out.print(rs.getMetaData().getColumnName(i));
System.out.print("\t");
}
while (rs.next()) {
System.out.println();
for (int i = 1;i <= columns;i++){
System.out.print(rs.getObject(i));
System.out.print("\t");
}
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// release resource ....
}
}
}
更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:www.yuque.com/riverzmm/uu… 《安全》