環境說明
MySQL 版本
MySQL 5.7.26
pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
JDK版本
JDK 1.8
MySQL配置SSL
查看MySQL是否支持SSL連接
- 查看MySQL是否支持SSL
SHOW VARIABLES LIKE 'have_ssl'
如果hava_ssl
對應的值爲YES
則支持SSL
- 查詢ssl證書地址
show variables like '%ssl%';
ssl_ca
對應的就是ssl證書名
創建SSL連接用戶
- 創建用戶
CREATE USER 'ssler'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'ssler'@'%'
- 查看用戶是否使用ssl
SELECT ssl_type From mysql.user Where user="ssler"
截圖中ssl_type爲空字符串,表示該用戶不強制要求使用ssl連接。
- 配置用戶必須使用ssl連接
ALTER USER 'ssler'@'%' REQUIRE SSL;
FLUSH PRIVILEGES
此時再執行SELECT ssl_type From mysql.user Where user="ssler"
ANY
表示必須使用ssl連接。
JDBC配置
導入證書
- 使用jdk自帶的keytool導入mysql的客戶端證書到密鑰倉庫,並生成密鑰文件。
根據上文查到的ca.pem,將其複製到目標主機上,然後執行下述指令
$ keytool -import -trustcacerts -v -alias Mysql -file ca.pem -keystore "mysql.ks"
輸入密鑰庫口令:
再次輸入新口令:
所有者: CN=MySQL_Server_5.7.26_Auto_Generated_CA_Certificate
發佈者: CN=MySQL_Server_5.7.26_Auto_Generated_CA_Certificate
序列號: 1
有效期爲 Wed Apr 29 16:32:45 CST 2020 至 Sat Apr 27 16:32:45 CST 2030
證書指紋:
MD5: 09:E7:41:84:08:B0:70:5F:AC:D6:03:61:CE:F4:50:DE
SHA1: 6B:EE:FE:B4:74:89:A3:88:6C:49:22:44:6D:FB:88:DE:18:6A:7A:F6
SHA256: 83:DD:8F:83:71:08:1D:36:D6:C0:2B:23:D2:E9:DC:84:0E:D6:ED:9A:E5:85:DF:7C:7C:52:33:9A:D7:83:0F:29
簽名算法名稱: SHA256withRSA
主體公共密鑰算法: 2048 位 RSA 密鑰
版本: 3
擴展:
#1: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
是否信任此證書? [否]: y
證書已添加到密鑰庫中
[正在存儲mysql.ks]
通過指令驗證證書是否導入:
$ keytool -list -keystore mysql.ks
輸入密鑰庫口令:
密鑰庫類型: jks
密鑰庫提供方: SUN
您的密鑰庫包含 1 個條目
mysql, 2020-6-9, trustedCertEntry,
證書指紋 (SHA1): 6B:EE:FE:B4:74:89:A3:88:6C:49:22:44:6D:FB:88:DE:18:6A:7A:F6
將證書放在目標服務器上
在密鑰倉庫文件生成的文件夾下,配置http服務器。此處使用go寫一個http文件服務器:
package main
import "net/http"
func main() {
http.Handle("/", http.FileServer(http.Dir(".")))
http.ListenAndServe(":9999", nil)
}
將編譯後的go程序放在與mysql.ks同一目錄下,並啓動即可
編寫JDBC代碼
public class JDBCMySQL {
public static void main(String[] args) {
Connection connection = null;
String urlWithCe = "jdbc:mysql://192.168.254.82:13306/cloud?" +
"useSSL=true&trustCertificateKeyStorePassword=123456&" +
"trustCertificateKeyStoreUrl=http://localhost:9999/mysql.ks&" +
"allowMultiQueries=true&" +
"useUnicode&characterEncoding=UTF-8&" +
"verifyServerCertificate=false&requireSSL=true";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(urlWithCe,
"ssler", "123456");
PreparedStatement preparedStatement = connection.prepareStatement("select * from " +
"cm_user");
System.out.println(preparedStatement.executeQuery().first());
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
trustCertificateKeyStorePassword=123456
爲密鑰倉庫的密碼,在生成密鑰倉庫文件時配置;
trustCertificateKeyStoreUrl=http://localhost:9999/mysql.ks
爲證書放置在http服務器後的地址