Windows

使用 Windows 作為伺服器和客戶端時在 MySQL 中啟用 SSL

  • March 12, 2020

我想在我安裝在 Windows 機器上的 MySQL 伺服器的連接上啟用 SSL,所以我用Google搜尋“使用 ssl mysql windows”。

第一個結果就是這個簡單直接的指南

從外觀上看,它似乎是我剛需要的指南。然而:

  • 按照步驟操作後,它不起作用。
  • 在更深入地閱讀了他引用的一些連結之後(例如他為接受空 –ssl-key 標誌的客戶端送出的錯誤),其中一些已經過時(因為我使用的 MySQL 版本沒有有這些問題)。
  • 在解決了我的問題後,我發現它有一些歧義,並且可以改進的地方,但是我不能建議對其進行編輯,因為作者已經關閉了他的部落格(或部落格條目)上的評論。

因此,我認為這種指南最好放在像 serverfault.com 這樣的網站上,任何人都可以在以後提出對答案的更改。

那麼,我願意接受這個問題的答案,這只是從這個部落格複製+粘貼,所以我以後可以提出修改建議。所以下次我需要在我的 MySQL 伺服器中設置 SSL 時,我找不到相同的怪癖,我有一個簡單而完整的指南可以遵循。並希望這在Google以後得到更高的排名。謝謝

通常,您可以從 MySQL 網站下載的適用於 Windows 的 MySQL 伺服器的二進製文件已使用 SSL 支持進行編譯。要仔細檢查是否是這種情況,我們可以通過mysql -uroot -p(在 Windows 中,mysql.exe位於 中C:\Program Files\MySQL\MySQL Server 5.7\bin)連接到我們的實例並執行:

mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ...           | ...      |

好的,所以 SSL 可用但現在已禁用(如果它的值中有一個“否”,則我們的二進製文件沒有啟用 SSL,我們需要尋找新的)。我們的目的是首先配置 MySQL,以便它在這些值中顯示“是”。

您還可以通過發出status查詢來查看目前連接是否正在使用 SSL:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          551
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 13 days 22 hours 23 min 24 sec

(當我們在伺服器中啟用 SSL 時,這將變得很方​​便,但仍要確保 SSL 被用於特定使用者/連接。)

現在我們在這個 mysql 控制台中,讓我們創建將使用 SSL 模式的使用者(使用者名是ssluser,密碼是sslpassword):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'sslpassword' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;

也可以對現有使用者執行等效操作,通過發出以下查詢強制他使用 SSL(如果她不使用,則不允許她連接):

mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

(並且要讓它回來允許他在沒有 SSL 的情況下進行連接將是:)

mysql> UPDATE mysql.user SET ssl_type = '' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

現在您需要在您的機器上安裝/可用 OpenSSL。許多人已經有了這個,當然大多數 Linux 反正。對於 Windows,您可以從此處下載。

現在已經不礙事了,您基本上正在查看一個 6 步過程,該過程需要從cmd我們安裝 OpenSSL 的文件夾(例如C:\OpenSSL-Win64\bin)中的命令行 ( ) 執行:

  1. 為我們的證書創建文件夾:

mkdir C:\mysqlCerts

  1. 為 OpenSSL 配置設置環境變數(遺憾的是,在撰寫本文時,預設情況下它並未在 Windows 建構中設置):

set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg

  1. 創建 CA 證書(以下 2 個命令創建 2 個文件:ca-cert.pem 和 ca-key.pem):

openssl genrsa 2048 > "C:\mysqlCerts\ca-key.pem"

openssl req -new -x509 -nodes -days 3600 -key "C:\mysqlCerts\ca-key.pem" > "C:\mysqlCerts\ca-cert.pem"

  1. 創建伺服器證書(以下 2 個命令創建 3 個文件:server-cert.pem、server-key.pem 和 server-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\server-key.pem" > "C:\mysqlCerts\server-req.pem"

openssl x509 -req -in "C:\mysqlCerts\server-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\server-cert.pem"

  1. 創建客戶端證書(以下 2 個命令創建 3 個文件:client-cert.pem、client-key.pem 和 client-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\client-key.pem" > "C:\mysqlCerts\client-req.pem"

openssl x509 -req -in "C:\mysqlCerts\client-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\client-cert.pem"

  1. 更新 MySQL 的配置文件(在 Windows 中,它被稱為my.ini,而不是my.cnf 在 Linux 中,也不my-default.ini是因為後者是一個模板),它通常位於C:\ProgramData\MySQL\MySQL Server 5.7\(注意:ProgramData 是一個隱藏文件夾),將其包含在以下[mysqld]部分下:

注意:如果您\s的路徑中有,則需要將其替換為,\\s因為 mysqld 會將 \s 替換為空格字元,這將破壞您的密鑰的路徑。額外的反斜杠轉義了原始反斜杠,使您的路徑完好無損。

ssl-ca = "C:\mysqlCerts\ca-cert.pem"

ssl-cert = "C:\mysqlCerts\\server-cert.pem"

ssl-key = "C:\mysqlCerts\\server-key.pem"

並重新啟動 mysql 服務/伺服器。

現在讓我們通過我們的普通使用者(不是ssluser)再次連接mysql -uroot -p,並檢查我們的 ssl 變數:

mysql> show global variables like '%ssl%';
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| have_openssl  | YES                                    |
| have_ssl      | YES                                    |
| ssl_ca        | C:\mysqlCerts\ca-cert.pem              |
| ssl_capath    |                                        |
| ssl_cert      | C:\mysqlCerts\server-cert.pem          |
| ssl_cipher    |                                        |
| ssl_crl       |                                        |
| ssl_crlpath   |                                        |
| ssl_key       | C:\mysqlCerts\server-key.pem           |
+---------------+----------------------------------------+

如果您沒有上述類似的內容,則說明某些內容效果不佳。也許您在創建證書/密鑰時分配了密碼?如果是這種情況,MySQL 就不能使用沒有密碼的那些。然後,我們可以通過發出以下 openssl 命令將其刪除:

openssl rsa -in "C:\mysqlCerts\server-key.pem" -out "C:\mysqlCerts\server-key-ppless.pem"

然後my.ini再次更改以指向這個新的-ppless.pem- 後綴文件。再次重新啟動mysql,再次連接,並檢查have_ssl現在YES。是嗎?通過顯示狀態進行雙重檢查:

mysql> status
--------------
mysql.exe  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 46 sec

現在 SSL 上面有東西了!讓我們連接新的ssluserthen,現在使用–ssl-mode標誌:

mysql.exe -ussluser -p --ssl-mode=REQUIRED

如果它連接,我們就完成了。

(但要仔細檢查,您可以嘗試在不使用 SSL 的情況下進行連接,以查看它是否拒絕您的連接,這樣:)

mysql.exe -ussluser -p --ssl=0

現在您應該配置您的應用程序以通過 SSL 使用其連接器。例如,如果您使用.NET 連接器,請查看此處的文件

引用自:https://serverfault.com/questions/783861