MySQL(三):MySQL SSL加密連接配置及Java客戶端連接

1:客戶段與MySQL服務端之間,是否使用加密的連接,可以通過三個層次控制。影響範圍依次縮小:

(1)服務端系統參數 require_secure_transport 開啓的時候,強制要求所有客戶端都是用加密連接。關閉的時候,允許加密和非加密的連接請求。默認是關閉的。

(2)創建用戶的時候,使用 REQUIRE 子句,指定此用戶連接數據庫的時候,必須使用加密連接。例如:

create user if not exists 'user01'@'%' identified by 'user01password' REQUIRE SSL 或者:
create user if not exists 'user02'@'%' identified by 'user02password' REQUIRE X509;

(3)客戶端連接的時候,指定是否建立SSL加密連接。從5.7.11版本開始,客戶端mysql提供的參數--ssl-mode,可以指定客戶端連接數據庫的時候,是否使用加密連接。

--ssl-mode的值

說明

DISABLED

與服務端建立一個非加密的連接。

PREFERRED

先試圖與服務器端簡歷加密連接,如果失敗,則嘗試建立非加密的連接。這個是默認值。需要注意的是,如果服務端和用戶都沒有強制要求使用加密連接,也沒有指定使用非加密連接,但是在datadir下面有可以使用的證書文件,客戶端會自動去建立加密連接。

REQUIRED

與服務器端建立加密連接。如果加密連接不能正常建立,則失敗。不會再去嘗試建立非加密連接。

VERIFY_CA

相對REQUIRED,還要求客戶端提供服務器端的CA證書來驗證服務器端的身份。

VERIFY_IDENTITY

相對VERIFY_CA,還會驗證主機名,防止中間人攻擊。對於初始化數據庫目錄是自動生成的證書或者調用mysql_ssl_rsa_setup 生成的證書,都是不起作用的。可以手動調用openssl命令生成證書來使用。

2:java客戶端程序與mysql服務端建立SSL加密連接
      基於springboot 2.2.7.RELEASE,mysql驅動爲 5.1.49(<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>)

(1)設置連接參數 useSSL爲true 。

如:spring.datasource.url=jdbc:mysql://localhost:3306/testingdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true

(2)在truststore 中導入服務端證書,即ca.pem5.7.29版本,初始化數據目錄的時候,如果設定參數爲 --initialize,就會自動生成證書,參見“《MySQL(二):MySQL安裝部署時的一些總結》步驟3”。否則需要手動生成。)。導入命令:
keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass truststore_pw

(3)MySQL服務端需要驗證客戶端的信息,需要客戶端提供自己的私鑰(client-key.pem)和SSL證書(client-cert.pem)。

          a:將client-cert.pem和client-key.pem做成pkcs12文件:
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:keystore_pw -out client-keystore.p12

          b:將生成的pkcs12文件導入到Java keystore裏面:
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass keystore_pw -destkeystore keystore.jks -deststoretype JKS -deststorepass keystore_pw

注意:中間文件client-keystore.p12的密碼必須與最終的keystore.jks文件的密碼一致。

(4)設置trust keystore相關的參數。方法有兩種:
    a:設置java的命令行參數:
         -Djavax.net.ssl.trustStore=path_to_truststore_file
         -Djavax.net.ssl.trustStorePassword=truststore_password

   b:設置系統屬性:
         System.setProperty("javax.net.ssl.trustStore","path_to_truststore.jks");  
         System.setProperty("javax.net.ssl.trustStorePassword","truststore_pw ");

(5)設置keystore相關的參數。方法有兩種:
    a:設置java的命令行參數:
         -Djavax.net.ssl.keyStore=path_to_keystore.jks
         -Djavax.net.ssl.keyStorePassword=keystore_pw

    b:設置系統屬性:
          System.setProperty("javax.net.ssl.keyStore","path_to_keystore.jks");
         
System.setProperty("javax.net.ssl.keyStorePassword","keystore_pw");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章