mysql使用jdbc連接增加ssl認證(2)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM