在 Mac 下架設 MySQL Server 並啟用 SSL 加密功能

說明

最近因為工作所需,需要使用 .NET 連接 MySQL Server。而不知道為什麼在 .NET 下,使用 SSL 加密功能連接 MySQL 總是會有問題。想想還是自己架設一台 MySQL 測試機做為對照組,看來能不能找出問題的原因。

本篇為 Mac 環境下架設 MySQL Server 的步驟整理。

目錄

一、MySQL Server 安裝

1. 安裝 Homebrew

參考 Homebirew 官網 的說明,使用以下 script 進行安裝︰

1
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. 安裝 MySQL Server

在安裝 Homebrew 後,我們就可以透過它來安裝 MySQL 了。指令如下︰

1
$ brew install mysql

在安裝完後,可以執行 mysql_secure_installation 指令來進行像重設 root 密碼、關閉 root 遠端登入等安全性設定。

1
$ mysql_secure_installation

3. 安裝 Homebrew Services

Homebrew Services 是 Homebrew 下一個很好用的工具,安裝它之後,就可以很方便的使用 Homebrew 為我們啓動或關閉像 MySQL、Tomcat 這樣的daemon 服務。有興趣的朋友可以讀讀 Starting and Stopping Background Services with Homebrew 這篇介紹文,會對它更深刻的了解。

使用以下指令進行安裝 (brew tap 表示要抓取第三方 repo 下的 homebrew 外掛,詳情可以看看 Homebrew Taps 官網上的介紹,這裡也就不再展開說明)︰

1
$ brew tap homebrew/services

在 Homebrew Services 安裝成功後,我們就可以使用以下指令,來啓動或關閉 MySQL Server 了,非常的方便。

1
2
3
$ brew services start mysql // 啓動
$ brew services stop mysql // 關閉
$ brew services stop mysql // 重啓

二、設定並開啓 MySQL Server 加密連線功能

1. 產生 MySQL Server 所需憑証

在啓用 MySQL 的 SSL 加密功能前,我們需要先產生 Server 需要的憑証(Certificate) 與金鑰(Key) 檔。

我們預計在 /usr/local/etc/mysql/certs 目錄下,建立相關檔案。步驟整理如下 (參考 MySQL 官網 Creating SSL Certificates and Keys Using openssl 說明文件)︰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ mkdir -p /usr/local/etc/mysql/certs
$ cd /usr/local/etc/mysql/certs

# 建立 CA 憑証
$ mkdir CA;cd CA
$ cd CA
$ openssl genrsa 2048 > ca-key.pem
$ openssl req -new -x509 -nodes -days 3600 \
-key ca-key.pem -out ca.pem
# 建立 Server 端所需憑証
$ cd ../
$ mkdir Server; cd Server
$ openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout server-key.pem -out server-req.pem
$ openssl rsa -in server-key.pem -out server-key.pem $ openssl x509 -req -in server-req.pem -days 3600 \
-CA ../CA/ca.pem -CAkey ../CA/ca-key.pem -set_serial 01 -out server-cert.pem

# 建立 Client 端所需憑証
$ cd ..
$ mkdir Client; cd Client
$ openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout client-key.pem -out client-req.pem
$ openssl rsa -in client-key.pem -out client-key.pem
$ openssl x509 -req -in client-req.pem -days 3600 \
-CA ../CA/ca.pem -CAkey ../CA/ca-key.pem -set_serial 01 -out client-cert.pem

在執行上述步驟後,我們可以執行 tree 指令看看 /usr/local/etc/mysql/certs 的目錄結構 (如果系統說找不到 tree 指令的話,一樣可以使用 brew install tree 指令進行安裝)︰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cd /usr/local/etc/mysql/certs
$ tree
.
├── CA
│   ├── ca-key.pem
│   └── ca.pem
├── Client
│   ├── client-cert.pem
│   ├── client-key.pem
│   └── client-req.pem
└── Server
├── server-cert.pem
├── server-key.pem
└── server-req.pem

3 directories, 8 files

2. 編輯 MySQL 設定檔 my.cnf

在產生完憑証與金鑰檔後,我們可以編輯 MySQL 設定檔 /usr/local/etc/my.cnf,啓動 SSL 相關設定,my.cnf 檔案下關於 SSL 的設定段落如下︰

補充說明︰你可以透過 mysqld --help --verbose 指令,知道 MySQL Server 查找 my.cnf 設定檔的路徑。

1
2
3
4
5
6
[mysqld]
# ...
# SSL
ssl-ca=/usr/local/etc/mysql/certs/CA/ca.pem
ssl-cert=/usr/local/etc/mysql/certs/Server/server-cert.pem
ssl-key=/usr/local/etc/mysql/certs/Server/server-key.pem

在設定完成後,我們需要重啓 MySQL Server︰

1
$ brew services restart mysql

3. 檢查 MySQL 的 SSL 設定

在服務重啓後,我們可以使用 root 帳號登入,確定 MySQL Server 有正確啓用 SSL 相關設定︰

1
$ mysql -u root -p

在登入 MySQL 後,可以使用 SHOW VARIABLES LIKE '%ssl%'; 指令,以顯示 Server 目前的 SSL 相關設定︰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+---------------------------------------------------+
| Variable_name | Value |
+---------------+---------------------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /usr/local/etc/mysql/certs/CA/ca.pem |
| ssl_capath | |
| ssl_cert | /usr/local/etc/mysql/certs/Server/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /usr/local/etc/mysql/certs/Server/server-key.pem |
+---------------+---------------------------------------------------+
9 rows in set (0.01 sec)

如果設定沒有任何錯誤的話,應該可以看到 have_opensslhave_ssl 設定值都被標定為 YES,而相關憑証與金鑰檔路徑也正確。

三、確認 MySQL 的 SSL 設定有效

我們可以使用 MySQL 內建的連線指令 mysql,確認上面我們做的 SSL 設定是否有效。我們先不特別指定 SSL 連線相關參數,看看此時會用什麼方式進行連線︰

1
2
3
4
5
6
7
8
$ mysql -u root -p
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.21, for osx10.13 (x86_64) using EditLine wrapper

# 略...
SSL: Not in use
# 略...

可以看到如果在 Client 端不特別指定的話,預設就是不使用 SSL,也就是使用未加密的方式連接到 MySQL Server。

這時候我們可以在 Client 端改用 SSL 方式進行連線︰

1
2
3
4
5
6
7
8
$ mysql --ssl-mode=REQUIRED --ssl-ca=/usr/local/etc/mysql/certs/CA/ca.pem --ssl-cert=/usr/local/etc/mysql/certs/Client/client-cert.pem --ssl-key=/usr/local/etc/mysql/certs/Client/client-key.pem -u root -p
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.21, for osx10.13 (x86_64) using EditLine wrapper

# 略...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
# 略...

可以看到 SSL 這一行由 Not in use 改為顯示目前正使用的 Cipher 演算法。

到此處,我們可以看到我們的 MySQL SSL 設定已經無誤,可以做後續的開發測試使用了。

References

Proudly powered by Hexo and Theme by Hacker
© 2020 LittleLin