MySQLはSSLを構成し、JDBC接続構成を変更します
1. OpenSSLを使用して、SSL証明書と秘密鍵を作成します
- オペレーティングシステムに応じてWin(xx)OpenSSLインストールをダウンロードします
- 生成された証明書と秘密鍵を保存するための新しいディレクトリを作成します
//生成一个 CA 私钥
openssl genrsa 2048 > cert/ca-key.pem
//使用私钥生成一个新的数字证书,执行这个命令时, 会需要填写一些问题, 随便填写就可以了
openssl req -sha1 -new -x509 -nodes -days 3650 -key ./cert/ca-key.pem > cert/ca-cert.pem
//创建服务器端RSA 私钥和数字证书,这个命令会生成一个新的私钥(server-key.pem), 同时会使用这个新私钥来生成一个证书请求文件(server-req.pem).
//这个命令同样需要回答几个问题, 随便填写即可. 不过需要注意的是, A challenge password 这一项需要为空
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout cert/server-key.pem > cert/server-req.pem
//将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in cert/server-key.pem -out cert/server-key.pem
//使用原先生成的 CA 证书来生成一个服务器端的数字证书
openssl x509 -sha1 -req -in cert/server-req.pem -days 3650 -CA cert/ca-cert.pem -CAkey cert/ca-key.pem -set_serial 01 > cert/server-cert.pem
//创建客户端的 RSA 私钥和数字证书
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout cert/client-key.pem > cert/client-req.pem
//将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in cert/client-key.pem -out cert/client-key.pem
//为客户端创建一个数字证书
openssl x509 -sha1 -req -in cert/client-req.pem -days 3650 -CA cert/ca-cert.pem -CAkey cert/ca-key.pem -set_serial 01 > cert/client-cert.pem
1.1SSL構成
前の手順で、次の8つのファイルを生成しました。
- ca-cert.pem:サーバー側/クライアント側のデジタル証明書を生成するために使用されるCA証明書。
- ca-key.pem:サーバー/クライアントデジタル証明書の生成に使用されるCA秘密鍵。
- server-key.pem:サーバーのRSA秘密鍵
- server-req.pem:サーバー側のデジタル証明書を生成するために使用されるサーバー側の証明書要求ファイル。
- server-cert.pem:サーバーのデジタル証明書。
- client-key.pem:クライアントのRSA秘密鍵
- client-req.pem:クライアントのデジタル証明書を生成するために使用されるクライアントの証明書要求ファイル。
- client-cert.pem:クライアントのデジタル証明書。
2.データベースがSSLをサポートしているかどうかを確認します
まず、MySQLで次のコマンドを実行して、MySQLがSSLをサポートしているかどうかを確認します。
mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.02 sec)
have_sslがYESの場合、MySQLサービスがすでにSSLをサポートしていることを意味します。DESABLEの場合、MySQLサービスを開始するときにSSL機能を有効にする必要があります。
2.1 MySQL構成ファイルを設定し、SSL認証を有効にします
vi my.cnf
# 在mysqld下面添加如下配置
[mysqld]
require_secure_transport = ON
2.2MySQLのSSLを構成する
次に、サーバーとクライアントを別々に構成する必要があります。
- サーバー側の構成
サーバー側は、CA証明書、サーバー側RSA秘密鍵、サーバー側デジタル証明書の3つのファイルを使用する必要があります。[mysqld]構成ドメインの下に次のコンテンツを追加する必要があります。
[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
次に、バインドアドレスを変更して、MySQLサービスがすべてのIPアドレスからクライアントを受信できるようにすることもできます。
bind-address = *
構成が完了したら、MySQLサービスを再起動する必要があります。
最後のステップで、SSLがログインする必要があるアカウントを追加して、構成したSSL構成が有効かどうかを確認します。
GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;
FLUSH PRIVILEGES;
- ユーザーがSSLを使用しているかどうかを確認します
SELECT ssl_type From mysql.user Where user="ssler"
ssl_typeは空の文字列であり、ユーザーがssl接続を使用する必要がないことを示します。
- sslを使用して接続するようにユーザーを構成する
ALTER USER 'ssler'@'%' REQUIRE SSL;
FLUSH PRIVILEGES
この時点で実行SELECT ssl_type From mysql.user Where user="ssler"
ANY
すると、SSL接続を使用する必要があります。
構成したら、rootを使用してMySQLにログインします
mysql --ssl-ca="D:/Program Files/OpenSSL-Win64/bin/cert/ca-cert.pem" --ssl-cert="D:/Program Files/OpenSSL-Win64/bin/cert/client-cert.pem" --ssl-key="D:/Program Files/OpenSSL-Win64/bin/cert/client-key.pem" -u coisini -p
接続が成功したときに、 '%ssl%'ステートメントのようなshow変数を実行すると、次の出力が表示されます。
mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
9 rows in set (0.01 sec)
3、JAVA-JDBC構成
jdkに付属のkeytoolを使用して、mysqlクライアント証明書をキーストアにインポートし、キーファイルを生成します。
上記のca.pemに従って、ターゲットホストにコピーしてから、次のコマンドを実行します。
- このコマンドを使用して、JavaがSSL接続を使用するために必要なファイルを生成します。
keytool -importcert -alias MySQLCACert -file "D:\Program Files\OpenSSL-Win64\bin\cert\ca-cert.pem" -keystore truststore -storepass 密码
- 手順を通じて証明書がインポートされていることを確認します
$ keytool -list -keystore mysql.ks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mysql, 2020-6-9, trustedCertEntry,
证书指纹 (SHA1): 6B:EE:FE:B4:74:89:A3:88:6C:49:22:44:6D:FB:88:DE:18:6A:7A:F6
- 生成されたファイルのシステム環境変数を構成します
名:JAVA_OPTS
值:-Djavax.net.ssl.trustStore="上一步中生成文件的本地路径" -Djavax.net.ssl.trustStorePassword="密码"
- JDBC構成接続
##jdbc.properties:
yxaq.dz=jdbc:mysql://127.0.0.1:3306/yxaqgl?verifyServerCertificate=true&useSSL=true&requireSSL=true