1. 程式人生 > 其它 >MySQL配置SSL,並修改JDBC連線配置

MySQL配置SSL,並修改JDBC連線配置

技術標籤:▷資料庫# ➹➹➹①MySQL / PL、SQLmysql資料庫ssljava

MySQL配置SSL,並修改JDBC連線配置

一、使用 OpenSSL 建立 SSL 證書和私鑰

  • 根據自己的作業系統下載Win(xx)OpenSSL安裝
  • 新建一個目錄用於存放生成的證書和私鑰
//生成一個 CA 私鑰
openssl genrsa 2048 > cert/ca-key.pem
//使用私鑰生成一個新的數字證書,執行這個命令時, 會需要填寫一些問題, 隨便填寫就可以了
openssl req -sha1 -new -x509 -nodes -days 3650 -key ./cert/ca-key.pem > cert/ca-cert.pem
//建立伺服器端RSA 私鑰和數字證書,這個命令會生成一個新的私鑰(server-key.pem), 同時會使用這個新私鑰來生成一個證書請求檔案(server-req.pem).
//這個命令同樣需要回答幾個問題, 隨便填寫即可. 不過需要注意的是, A challenge password 這一項需要為空
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout cert/server-key.pem >
cert/server-req.pem //將生成的私鑰轉換為 RSA 私鑰檔案格式 openssl rsa -in cert/server-key.pem -out cert/server-key.pem //使用原先生成的 CA 證書來生成一個伺服器端的數字證書 openssl x509 -sha1 -req -in cert/server-req.pem -days 3650 -CA cert/ca-cert.pem -CAkey cert/ca-key.pem -set_serial 01 > cert/server-cert.pem //建立客戶端的 RSA 私鑰和數字證書 openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout cert/client-key.pem >
cert/client-req.pem //將生成的私鑰轉換為 RSA 私鑰檔案格式 openssl rsa -in cert/client-key.pem -out cert/client-key.pem //為客戶端建立一個數字證書 openssl x509 -sha1 -req -in cert/client-req.pem -days 3650 -CA cert/ca-cert.pem -CAkey cert/ca-key.pem -set_serial 01 > cert/client-cert.pem

1.1 SSL 配置

在前面的步驟中, 我們已經生成了8個檔案, 分別是:

  • ca-cert.pem: CA 證書, 用於生成伺服器端/客戶端的數字證書.
  • ca-key.pem: CA 私鑰, 用於生成伺服器端/客戶端的數字證書.
  • server-key.pem: 伺服器端的 RSA 私鑰
  • server-req.pem: 伺服器端的證書請求檔案, 用於生成伺服器端的數字證書.
  • server-cert.pem: 伺服器端的數字證書.
  • client-key.pem: 客戶端的 RSA 私鑰
  • client-req.pem: 客戶端的證書請求檔案, 用於生成客戶端的數字證書.
  • client-cert.pem: 客戶端的數字證書.

二、檢視資料庫是否支援 SSL

首先在 MySQL 上執行如下命令, 查詢是否 MySQL 支援 SSL:

mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   |
+---------------+-------+
1 row in set (0.02 sec)

當 have_ssl 為 YES 時, 表示此時 MySQL 服務已經支援 SSL 了. 如果是 DESABLE, 則需要在啟動 MySQL 服務時, 使能 SSL 功能.

2.1 設定MySQL配置檔案,開啟SSL驗證

vi my.cnf

# 在mysqld下面新增如下配置
[mysqld]
require_secure_transport = ON

2.2 配置MySQL的SSL

接下來我們就需要分別配置伺服器端和客戶端:

  • 伺服器端配置
    伺服器端需要用到三個檔案, 分別是: CA 證書, 伺服器端的 RSA 私鑰, 伺服器端的數字證書, 我們需要在 [mysqld] 配置域下新增如下內容:
[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

接著我們還可以更改 bind-address, 使 MySQL 服務可以接收來自所有 ip 地址的客戶端, 即:

bind-address = *

當配置好後, 我們需要重啟 MySQL 服務
最後一步, 我們新增一個需要使用 SSL 才可以登入的帳號, 來驗證一下我們所配置的 SSL 是否生效:

GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;
FLUSH PRIVILEGES;
  • 檢視使用者是否使用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連線。

當配置好後, 使用 root 登入 MySQL

mysql --ssl-ca="D:/Program Files/OpenSSL-Win64/bin/cert/ca-cert.pem" --ssl-cert="D:/Program Files/OpenSSL-Win64/bin/cert/client-cert.pem" --ssl-key="D:/Program Files/OpenSSL-Win64/bin/cert/client-key.pem"  -u coisini -p

當連線成功後, 我們執行 show variables like ‘%ssl%’ 語句會有如下輸出:

mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
9 rows in set (0.01 sec)

三、JAVA-JDBC配置

使用jdk自帶的keytool匯入mysql的客戶端證書到金鑰倉庫,並生成金鑰檔案。

根據上文查到的ca.pem,將其複製到目標主機上,然後執行下述指令

  • 使用該命令生成java使用SSL連線所需的檔案:
keytool -importcert -alias MySQLCACert -file "D:\Program Files\OpenSSL-Win64\bin\cert\ca-cert.pem" -keystore truststore -storepass 密碼
  • 通過指令驗證證書是否匯入
$ 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
  • 將生成的檔案配置系統環境變數
名:JAVA_OPTS 
值:-Djavax.net.ssl.trustStore="上一步中生成檔案的本地路徑" -Djavax.net.ssl.trustStorePassword="密碼"
  • JDBC配置連線
##jdbc.properties:
yxaq.dz=jdbc:mysql://127.0.0.1:3306/yxaqgl?verifyServerCertificate=true&useSSL=true&requireSSL=true