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.pem(5.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");