MySQL開啟SSL加密


摘自:

https://www.docs4dev.com/docs/zh/mysql/5.7/reference/creating-ssl-files-using-openssl.html#creating-ssl-files-using-openssl-unix-command-line

https://www.docs4dev.com/docs/zh/mysql/5.7/reference/using-encrypted-connections.html

https://www.docs4dev.com/docs/zh/mysql/5.7/reference/create-user.html#create-user-tls

https://www.jianshu.com/p/3371740b7b02 數字證書詳解 

 

示例 1:在 Unix 上從命令行創建 SSL 文件

以下示例顯示了一組用於創建 MySQL 服務器和 Client 端證書以及密鑰文件的命令。您將需要通過 openssl 命令來響應多個提示。要生成測試文件,可以按 Enter 鍵進入所有提示。要生成供生產使用的文件,應提供非空響應。

# Create clean environment
rm -rf newcerts
mkdir newcerts && cd newcerts

# Create CA certificate
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 \
        -key ca-key.pem -out ca.pem

# Create server certificate, remove passphrase, and sign it
# server-cert.pem = public key, server-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 \
        -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# Create client certificate, remove passphrase, and sign it
# client-cert.pem = public key, client-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 \
        -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

生成證書后,請驗證它們:

 

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

您應該看到這樣的響應:

server-cert.pem: OK
client-cert.pem: OK

要查看證書的內容(例如,檢查證書有效的日期范圍),請像下面這樣調用 openssl :

openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem

現在,您可以使用一組文件,如下所示:

  • ca.pem:使用它來設置服務器端的ssl_ca系統變量和 Client 端端的--ssl-ca選項。 (如果使用了 CA 證書,則雙方必須相同.)

  • server-cert.pemserver-key.pem:使用它們來設置服務器端的ssl_certssl_key系統變量。

  • client-cert.pemclient-key.pem:將它們用作 Client 端上--ssl-cert--ssl-key選項的參數。

 

加密連接的服務器端啟動配置

在服務器端,--ssl選項指定服務器允許但不需要加密連接。默認情況下啟用此選項,因此無需顯式指定。

要要求 Client 端使用加密連接進行連接,請啟用require_secure_transport系統變量。參見將加密連接配置為強制性

服務器端的這些系統變量指定允許 Client 端構建加密連接時服務器使用的證書和密鑰文件:

  • ssl_ca:證書頒發機構(CA)證書文件的路徑名。 (ssl_capath類似,但指定了 CA 證書文件目錄的路徑名。)

  • ssl_cert:服務器公用密鑰證書文件的路徑名。可以將此證書發送到 Client 端,並根據其擁有的 CA 證書進行身份驗證。

  • ssl_key:服務器私鑰文件的路徑名。

例如,要為服務器啟用加密連接,請在my.cnf文件中以以下幾行啟動它,並根據需要更改文件名:

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

 

 以非SSL方式連接數據庫

mysql -h172.16.252.128 -uroot -p123456 --skip-ssl

 

創建用戶示例

1、創建一個用戶,既可以加密登錄,也可以非加密登錄,默認會以加密的方式登錄

create user require_none identified by '123456' REQUIRE NONE;

加密方式登錄

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_none

mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper

Connection id: 7
Current database:
Current user: require_none@172.16.252.128
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256

 非加密方式登錄

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_none --skip-ssl


mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using  EditLine wrapper

Connection id:          8
Current database:
Current user:           require_none@172.16.252.128
SSL:                    Not in use

 

2、創建一個用戶,必須以加密的方式進行登錄

create user require_ssl identified by '123456' REQUIRE ssl;

默認以加密方式登錄,可以成功登錄

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_ssl


mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using  EditLine wrapper

Connection id:          10
Current database:
Current user:           require_ssl@172.16.252.128
SSL:                    Cipher in use is ECDHE-RSA-AES128-GCM-SHA256

 

以非加密方式登錄,報錯登錄失敗。

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_ssl --skip-ssl
mysql: [Warning] Using a password on the command line interface can be insecure.
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
ERROR 1045 (28000): Access denied for user 'require_ssl'@'172.16.252.128' (using password: YES)

 

 

3、必須指定證書進行登錄,--ssl-key和--ssl-cert

create user require_x509 identified by '123456' REQUIRE x509;

 

默認以加密方式登錄,登錄失敗

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_x509
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'require_x509'@'172.16.252.128' (using password: YES)

 

指定證書進行登錄

[root@node1 mysql]# mysql -h172.16.252.128 -p123456 -urequire_x509 --ssl-key=/var/lib/mysql/client-key.pem --ssl-cert=/var/lib/mysql/client-cert.pem

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using  EditLine wrapper

Connection id:          14
Current database:
Current user:           require_x509@172.16.252.128
SSL:                    Cipher in use is ECDHE-RSA-AES128-GCM-SHA256

 

 4、指定證書並且證書發布者內容和根證書要匹配

這個參考了官方文檔,但官網寫的也有些問題,不太准 。

https://dev.mysql.com/doc/refman/5.7/en/create-user.html#create-user-tls

 

4.1 首先查看ca證書或server-cert 或 client-cert證書內容。

可以看到issuer 這部分內容,這部分是證書發行者相關信息,在創建證書時我們都填寫過,我這里是隨便寫的。

 

[root@node1 mysql]# openssl x509 -text -in client-cert.pem
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
 Issuer: C=ss, ST=de, L=fg, O=de, OU=eg, CN=cc/emailAddress=dd@ww.com         Validity
            Not Before: Aug 30 09:49:09 2021 GMT
            Not After : Jul  9 09:49:09 2031 GMT
        Subject: C=eg, ST=eg, L=eg, O=eg, OU=eg, CN=eg/emailAddress=eg@qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)

 

4.2參考官方文檔,我只指定了證書的部分內容,但是登錄時一直報錯密碼不對,

create user require_issuer identified by '123456' REQUIRE ISSUER 'C=ss/ST=de/L=fg/O=de/CN=cc/emailAddress=dd@ww.com';

通過在網上搜索,原來在錯誤日志中,可以看到證書不匹配的內容,我在創建用戶時沒有指定OU部分內容

 2021-08-31T09:12:51.314475Z 6 [Note] X509 issuer mismatch: should be ' /C=ss/ST=de/L=fg/O=de/CN=cc/emailAddress=dd@ww.com' but is '/ C=ss/ST=de/L=fg/O=de/OU=eg/CN=cc/emailAddress=dd@ww.com'

 重新創建用戶,再次登錄就正常了。

mysql> create user require_issuer identified by '123456' REQUIRE ISSUER '/C=ss/ST=de/L=fg/O=de/OU=eg/CN=cc/emailAddress=dd@ww.com';
Query OK, 0 rows affected (0.00 sec)

 

  

 4、指定證書登錄並且證書subject信息要與建用戶時指定的一樣,否則無法登錄。

先查看 client-crt 證書 subject 信息

[root@node1 mysql]# openssl x509 -text -in client-cert.pem
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=ss, ST=de, L=fg, O=de, OU=eg, CN=cc/emailAddress=dd@ww.com
        Validity
            Not Before: Aug 30 09:49:09 2021 GMT
            Not After : Jul  9 09:49:09 2031 GMT
 Subject: C=eg, ST=eg, L=eg, O=eg, OU=eg, CN=eg/emailAddress=eg@qq.com         Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:

創建用戶

mysql> create user require_subject identified by '123456' REQUIRE subject '/C=eg/ST=eg/L=eg/O=eg/OU=eg/CN=eg/emailAddress=eg@qq.com';
Query OK, 0 rows affected (0.00 sec)

 

 

 

 

 

 

 

 

 

 

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM