為 MySQL 建立 openSSL 安全憑證

之前有寫過怎樣製作憑證來達成安全連線,不過只有寫到 apache 和 mail 相關的程式。最近安裝 MySQL 5.1 server 之後,想說有把支援 openssl 編進去,不過也不知道有沒有作用。所以看了一下:

# mysql -u user -p
mysql> SHOW VARIABLES LIKE 'have_ssl';
Variable_name Value
have_ssl DISABLE

阿勒,居然沒有開啟:XD(表示 MySQL 有支援 SSL,但功能沒有打開)。只好搬救兵囉。參考網站:

基本上做法是跟 hy2003fly 的做法差不多,只是他的伺服器憑證那邊產生的方式需要密碼驗證,他下面寫說可以移除密碼的指令又沒有用。只好也參照之前的文章來修改。
作業系統:FreeBSD 7.1 Release、MySQL 5.1.30
1. 建立放置 SSL 憑證的目錄(設定放在 /etc/ssl 下)和相關檔案:

# mkdir /etc/ssl/mysql
# cd /etc/ssl/mysql
# cp ../openssl.cnf ./
# mkdir private
# mkdir newcerts
# touch index.txt
# echo "01" > ./serial

2. 編輯產生憑證時選項的預設值。(也可以把預設值更改,像把 Country 改成 TW...):

# ee openssl.cnf
更改:
[ CA_default ] 下的
dir =  ./demoCA   # Where everything is kept
改成:
dir =  /etc/ssl/mysql
(改成目前的目錄)

3. 開始產生憑證(先產生根憑證):

#openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -config openssl.cnf

4. 再來產生伺服器的憑證(一樣先產生 Key,再來是申請書,最後是簽發憑證):

# openssl genrsa -out server-key.pem 2048
# openssl req -new -key server-key.pem -out server-req.pem -config openssl.cnf
# openssl ca -policy policy_anything -out server-cert.pem -config openssl.cnf -infiles server-req.pem

5. 最後產生給 Client 端用的憑證:

# openssl genrsa -out client-key.pem 2048
# openssl req -new -key client-key.pem -out client-req.pem -config openssl.cnf
# openssl ca -policy policy_anything -out client-cert.pem -config openssl.cnf -infiles client-req.pem

6. 這樣憑證就都好了,最後是要修改設定檔,把這些憑證的路徑寫進去:

# ee /etc/my.cnf
在 [client] 這一段加入:
ssl-ca=/etc/ssl/mysql/cacert.pem
ssl-cert=/etc/ssl/mysql/client-cert.pem
ssl-key=/etc/ssl/mysql/client-key.pem
在 [mysqld] 加入:
ssl-ca=/etc/ssl/mysql/cacert.pem
ssl-cert=/etc/ssl/mysql/server-cert.pem
ssl-key=/etc/ssl/mysql/server-key.pem

重新啟動 MySQL,就可以用 SSL 連線囉。檢查的方法有:
1. 一開始用的檢查參數:

# mysql -u user -p
mysql> SHOW VARIABLES LIKE 'have_ssl';
Variable_name Value
have_ssl YES

2. 用命令列以 SSL 連線:

# mysql --ssl-ca=cacert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u user -p

3. 建立一個使用者,只能用 SSL 連線(這我就沒試了,因為還要建立使用者:01):

mysql> GRANT ALL on somedatabase.* TO 'ssluser'@'localhost' IDENTIFIED BY 'some_password' REQUIRE SSL;
# mysql -ussluser -p --ssl-ca=/etc/mysql/cacert.pem

不過不知道如果都強制使用者只能用 SSL 登入的話會怎樣?有空來試試看!

Please follow and like us:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *