1、背景:html
使用MySQL5.6過程當中,發現默認的加密插件爲mysql_native_password。而sha256_password的安全程度要比mysql_native_password高,嘗試切換爲sha256_password。node
2、配置過程:mysql
資料:sql
一、從MySQL官網查詢到服務器端sha256_password無需顯式加載,能夠在MySQL配置文件中配置使能。數據庫
官網見:https://dev.mysql.com/doc/refman/5.6/en/sha256-pluggable-authentication.htmlsegmentfault
[mysqld] 安全
default-authentication-plugin=sha256_passwordbash
二、據官網描述,要啓用插件,須經過ssl方式進行鏈接,也就是說須要配置相關證書。服務器
實現過程:session
一、下載MySQL安裝包,https://dev.mysql.com/downloads/mysql/5.6.html#downloads
】
二、安裝MySQL
下載的的MySQL是zip格式的,解壓到磁盤後,將my-default.ini另存爲my.ini(此處看我的愛好,可不用),關於my.ini須要修改的地方以下:
1)basedir datadir port 須要根據本身使用狀況配置。
2)配置默認啓用的加密插件。
三、簡單配置完mysql配置文件後,以管理員方式打開cmd,進入第二步解壓後的xxxmyql/bin目錄。
1)執行mysqld -install(tips:mysqld -remove 是卸載mysql),也能夠執行服務名稱及配置文件路徑:mysqld install mysql5 --defaults-file="E:\mysql5.6\my.ini"
2)執行net start mysql5啓動MySQL服務(個人服務名稱爲mysql5,上一步install時指定了服務名稱,若是install時沒指定默認就是MySQL)
3)輸入mysql -uroot -p鏈接數據庫。第一次進入沒有密碼,直接回車。
4)進入mysql數據庫,查詢user表的內容,發現默認使用的加密插件爲mysql_native_password以下圖。
是否是my.ini配置的sha256_password沒有生效吶?建立一個用戶驗證下插件是否生效。執行:CREATE USER 'test01'@'localhost' IDENTIFIED BY 'password';發現默認插件是生效了的。可是默認的root爲啥不是sha256_password呢,我猜測(只是猜測)
多是假如root用戶默認爲sha256_password,那麼使用root鏈接的話,就須要配置相關證書,這樣使MySQL的安裝過程複雜且使用體驗下降。
使用新建立的用戶test01登陸數據庫,由於test01用戶使用了sha256_password,此時是登陸失敗的,提示身份驗證須要SSL加密。因此要使用了sha256_password插件的用戶是須要經過SSL加密的,也就是須要證書的。
5)補充一點:安裝完成後root用戶是沒有密碼的,要設置密碼能夠執行mysqladmin -u root -p password,Enter password:直接回車,由於此時root時沒有密碼的,接着輸入及確認輸入本身的密碼。至此MySQL的安裝已經完成。
3.證書製做及使能
1)找一臺安裝openssl的Linux的虛擬機,製做證書:(參考:http://www.javashuo.com/article/p-meanlkoi-ma.html)
a 生成一個 CA 私鑰:openssl genrsa 2048 > ca-key.pem
b 私鑰生成一個新的數字證書:openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem,執行過程當中須要填寫一些內容,如國家、城市、郵箱等根據實際狀況填寫。
c 建立服務側的私鑰及數字證書:openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem
此時會填寫一些內容如b步驟,其中有個密碼能夠直接回車。
d 將生成的私鑰轉換爲 RSA 私鑰文件格式:openssl rsa -in server-key.pem -out server-key.pem
e 使用CA 證書來生成一個服務器端的數字證書:openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
至此,服務端相關證書已建立成果,下面建立客戶端證書。
f 爲客戶端生成一個私鑰和證書:openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem 須要填寫問題見步驟b
g 將生成的私鑰轉換爲 RSA 私鑰文件格式:openssl rsa -in client-key.pem -out client-key.pem
h 爲客戶端建立一個數字證書:openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
至此,客戶端和服務端證書所有建立完畢,生產八個文件以下:
2)配置證書
a 如今數據庫中是沒有開啓SSL的,執行命令查看:show variables like
'%ssl%'
;
b 開啓SSL方法:證書使能,在MySQL的配置文件my.ini中指定服務端證書路徑
ssl-ca=E:/mysql5.6/cert/ca-cert.pem
ssl-cert=E:/mysql5.6/cert/server-cert.pem
ssl-key=E:/mysql5.6/cert/server-key.pem
c 重啓MySQL服務,執行net stop mysql5中止服務,再執行net startmysql5開啓服務
d 再次執行show variables like
'%ssl%'
; 查看SSL已經開啓了
至此MySQL安裝及配置證書過程結束。
測試:
一、上面步驟中,在數據庫中建立了以sha256_password加密的test01用戶,密碼爲password。此時咱們用通常的方式鏈接確定會報錯
二、使用開啓SSL、指定證書的方式鏈接就是成功的,且經過\s 能夠看出SSL信息,命令:mysql --ssl-ca=E:\mysql5.6\cert\ca-cert.pem --ssl-cert=E:\mysql5.6\cert\client-cert.pem --ssl-key=E:\mysql5.6\cert\client-key.pem -u test01 -ppasswor
三、當前系統中的root用戶仍是mysql_native_password的加密方式,若是要想將root的加密方式修改的話執行:
use mysql;
update user set plugin='sha256_password' where user='root';
結果以下:
如今以root用戶修改root用戶的密碼,執行:SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1qaz@WSX');此時執行成功,再執行 FLUSH PRIVILEGES; password列已經被修改以下圖,退出客戶端從新鏈接爲啥連不上了?
使用ssl方式鏈接失敗了,可是使用空密碼(直接回車)登陸是成功的
這是爲何呢,經過分析以前使用sha256_password建立的test01用戶發現:test01用戶的passwor字段爲空,authentication_string字段是有值的;而此時的root的password是有密文的,但authentication_string字段沒有值。
因此咱們能得出2點:
sha256_password加密的用戶,密碼實際上是設置在authentication_string字段上的。
root登陸時,修改密碼插件後,執行SET PASSWORD FOR 'root'@'localhost'設置密碼時,當前CMD的session沒有實效,仍是以前的加密插件在生效,修改的固然是password字段的值,而authentication_string字段的值依舊是空串。
最終使用空密碼登陸後再執行一次設置密碼的命令,SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1qaz@WSX'); FLUSH PRIVILEGES;再退出,使用root及新密碼登陸就是成功的了。
附上個人my.ini
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the # *** default location during install, and will be replaced if you # *** upgrade to a newer version of MySQL. [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # These are commonly set, remove the # and set as required. basedir = E:/mysql5.6 datadir = E:/mysql5.6/data port =3306 # server_id = ..... default-authentication-plugin=sha256_password ssl-ca=E:/mysql5.6/cert/ca-cert.pem ssl-cert=E:/mysql5.6/cert/server-cert.pem ssl-key=E:/mysql5.6/cert/server-key.pem # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES