之前有寫過怎樣製作憑證來達成安全連線,不過只有寫到 apache 和 mail 相關的程式。最近安裝 MySQL 5.1 server 之後,想說有把支援 openssl 編進去,不過也不知道有沒有作用。所以看了一下:
# mysql -u user -p mysql> SHOW VARIABLES LIKE 'have_ssl';
Variable_name Value have_ssl DISABLE
阿勒,居然沒有開啟(表示 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 連線(這我就沒試了,因為還要建立使用者):
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: