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