JDBC如何通過SSL方式連接MySQL
環(huán)境說明
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
對應(yīng)的值為YES
則支持SSL
- 查詢ssl證書地址
show variables like '%ssl%';
ssl_ca
對應(yīng)的就是ssl證書名
創(chuàng)建SSL連接用戶
- 創(chuàng)建用戶
CREATE USER 'ssler'@'%' IDENTIFIED BY '123456'; GRANT ALL ON *.* TO 'ssler'@'%'
- 查看用戶是否使用ssl
SELECT ssl_type From mysql.user Where user="ssler"
截圖中ssl_type為空字符串,表示該用戶不強(qiáng)制要求使用ssl連接。
- 配置用戶必須使用ssl連接
ALTER USER 'ssler'@'%' REQUIRE SSL; FLUSH PRIVILEGES
此時再執(zhí)行
SELECT ssl_type From mysql.user Where user="ssler"
ANY
表示必須使用ssl連接。
JDBC配置
導(dǎo)入證書
- 使用jdk自帶的keytool導(dǎo)入mysql的客戶端證書到密鑰倉庫,并生成密鑰文件。
- 根據(jù)上文查到的ca.pem,將其復(fù)制到目標(biāo)主機(jī)上,然后執(zhí)行下述指令
$ keytool -import -trustcacerts -v -alias Mysql -file ca.pem -keystore "mysql.ks" 輸入密鑰庫口令: 再次輸入新口令: 所有者: CN=MySQL_Server_5.7.26_Auto_Generated_CA_Certificate 發(fā)布者: 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 擴(kuò)展: #1: ObjectId: 2.5.29.19 Criticality=false BasicConstraints:[ CA:true PathLen:2147483647 ] 是否信任此證書? [否]: y 證書已添加到密鑰庫中 [正在存儲mysql.ks]
通過指令驗(yàn)證證書是否導(dǎo)入:
$ 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
將證書放在目標(biāo)服務(wù)器上
在密鑰倉庫文件生成的文件夾下,配置http服務(wù)器。
此處使用go寫一個http文件服務(wù)器:
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服務(wù)器后的地址
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis如何使用PageHelper實(shí)現(xiàn)分頁查詢
這篇文章主要介紹了MyBatis如何使用PageHelper實(shí)現(xiàn)分頁查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot開發(fā)實(shí)戰(zhàn)系列之動態(tài)定時任務(wù)
在我們?nèi)粘5拈_發(fā)中,很多時候,定時任務(wù)都不是寫死的,而是寫到數(shù)據(jù)庫中,從而實(shí)現(xiàn)定時任務(wù)的動態(tài)配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開發(fā)實(shí)戰(zhàn)系列之動態(tài)定時任務(wù)的相關(guān)資料,需要的朋友可以參考下2021-08-08

java多線程實(shí)現(xiàn)同步鎖賣票實(shí)戰(zhàn)項(xiàng)目

Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例

Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理解讀

MyBatis如何調(diào)用存儲過程與存儲函數(shù)