使用 Windows 作為伺服器和客戶端時在 MySQL 中啟用 SSL
我想在我安裝在 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
)中的命令行 ( ) 執行:
- 為我們的證書創建文件夾:
mkdir C:\mysqlCerts
- 為 OpenSSL 配置設置環境變數(遺憾的是,在撰寫本文時,預設情況下它並未在 Windows 建構中設置):
set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg
- 創建 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"
- 創建伺服器證書(以下 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"
- 創建客戶端證書(以下 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"
- 更新 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 上面有東西了!讓我們連接新的
ssluser
then,現在使用–ssl-mode標誌:mysql.exe -ussluser -p --ssl-mode=REQUIRED
如果它連接,我們就完成了。
(但要仔細檢查,您可以嘗試在不使用 SSL 的情況下進行連接,以查看它是否拒絕您的連接,這樣:)
mysql.exe -ussluser -p --ssl=0
現在您應該配置您的應用程序以通過 SSL 使用其連接器。例如,如果您使用.NET 連接器,請查看此處的文件。