web-dev-qa-db-ja.com

Windowsをサーバーおよびクライアントとして使用する場合のMySQLでのSSLの有効化

WindowsマシンにインストールしたMySQLサーバーへの接続でSSLを有効にしたかったので、「use ssl mysql windows」とグーグル検索しました。

最初の結果は このシンプルで簡単なガイド です。

見た目からは、ちょうど欲しかったガイドのようです。しかしながら:

  • 手順を実行した後、それは動作しません。
  • 彼が参照するリンクの一部(クライアントが空の--ssl-keyフラグを受け入れるために提出したバグなど)をより深く読んだ後、それらの一部は廃止されました(私が使用していないバージョンのMySQLを使用しているため)これらの問題があります)。
  • 問題のトラブルシューティングを行った後、いくつかのあいまいさや改善の余地があることがわかりましたが、著者がブログ(またはブログエントリ)のコメントを閉じたため、編集を提案することはできません。

したがって、このようなガイドは、serverfault.comのようなサイトに配置した方がよいと思います。このサイトでは、誰もが回答の変更を後で提案できます。

私は、この質問に対する回答を、このブログからのコピーと貼り付けだけで受け入れることをいとわないので、後で変更を提案できます。そして、次回、MySQLサーバーでSSLをセットアップする必要があるとき、同じ癖が見つからず、従うべき簡単で完全なガイドがあります。そして、うまくいけば、これは後でグーグルによってより高くランク付けされます。ありがとう

1
user1623521

通常、MySQL WebサイトからダウンロードできるWindows用MySQLサーバーのバイナリは、SSLサポート付きでコンパイルされています。これが事実であることを再確認するには、mysql -uroot -p(Windowsではmysql.exeC:\Program Files\MySQL\MySQL Server 5.7\binにあります)を介してインスタンスに接続し、次を実行します。

mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ...           | ...      |

OK、SSLは利用可能ですが、現時点では無効になっています(値に「NO」が含まれている場合、バイナリに対してSSLが有効になっていないため、新しいものを探す必要があります)。私たちの目的は、最初にMySQLを設定して、これらの値に「YES」が表示されるようにすることです。

statusクエリを発行して、現在の接続にSSLが使用されているかどうかを確認することもできます。

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          551
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 13 days 22 hours 23 min 24 sec

(これはサーバーでSSLを有効にするときに便利になりますが、SSLが特定のユーザー/接続に使用されていることを確認したい場合もあります。)

このmysqlコンソール内にいるので、SSLモードを使用するユーザーを作成しましょう(ユーザー名はssluser、パスワードはsslpassword):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'sslpassword' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;

次のクエリを発行することで、SSLを使用するように強制する(接続しない場合は接続を許可しない)ために、既存のユーザーに対しても同等のことができます。

mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

(そして、SSLなしで接続できるように戻すには:)

mysql> UPDATE mysql.user SET ssl_type = '' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

次に、マシンにOpenSSLをインストール/使用可能にする必要があります。多くの人はすでにこれを持っていますが、確かにほとんどのLinuxはとにかくです。 Windowsの場合は、 こちら からダウンロードできます。

これで説明は終わりです。基本的に6つのステップからなるプロセスを見ていきます。これは、OpenSSLをインストールしたフォルダー(例:C:\OpenSSL-Win64\bin)のコマンドライン(cmd)から実行する必要があります。 ):

  1. 証明書用のフォルダーを作成します。

mkdir C:\mysqlCerts

  1. OpenSSL設定用の環境変数を設定します(残念ながら これは、この記事の執筆時点では、Windowsビルドではデフォルトで設定されていないため )。

set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg

  1. CA証明書を作成します(以下の2つのコマンドで2つのファイルを作成します:ca-cert.pemおよびca-key.pem):

openssl genrsa 2048 > "C:\mysqlCerts\ca-key.pem"

openssl req -new -x509 -nodes -days 3600 -key "C:\mysqlCerts\ca-key.pem" > "C:\mysqlCerts\ca-cert.pem"

  1. サーバー証明書の作成(次の2つのコマンドで3つのファイルを作成:server-cert.pem、server-key.pem、およびserver-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\server-key.pem" > "C:\mysqlCerts\server-req.pem"

openssl x509 -req -in "C:\mysqlCerts\server-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\server-cert.pem"

  1. クライアント証明書を作成します(次の2つのコマンドで3つのファイルを作成します:client-cert.pem、client-key.pem、client-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\client-key.pem" > "C:\mysqlCerts\client-req.pem"

openssl x509 -req -in "C:\mysqlCerts\client-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\client-cert.pem"

  1. MySQLの構成ファイルを更新します(Windowsではmy.iniと呼ばれ、Linuxのようにmy.cnfではなく、後者はテンプレートであるためmy-default.iniではありません)。これは通常C:\ProgramData\MySQL\MySQL Server 5.7\にあります(注:ProgramDataは隠しフォルダーです)、これを[mysqld]セクションに含めます。

注:パスに\sが含まれている場合、mysqldが\ sを空白文字に置き換えて空白文字を壊すため、パスを\\sに置き換える必要があります。キーへのパス。余分なバックスラッシュは元のバックスラッシュをエスケープして、パスをそのままにします。

ssl-ca = "C:\mysqlCerts\ca-cert.pem"

ssl-cert = "C:\mysqlCerts\\server-cert.pem"

ssl-key = "C:\mysqlCerts\\server-key.pem"

mysqlサービス/サーバーを再起動します。

ここで、mysql -uroot -pを使用して、通常のユーザー(ssluserではなく)を介して再度接続し、ssl変数を確認します。

mysql> show global variables like '%ssl%';
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| have_openssl  | YES                                    |
| have_ssl      | YES                                    |
| ssl_ca        | C:\mysqlCerts\ca-cert.pem              |
| ssl_capath    |                                        |
| ssl_cert      | C:\mysqlCerts\server-cert.pem          |
| ssl_cipher    |                                        |
| ssl_crl       |                                        |
| ssl_crlpath   |                                        |
| ssl_key       | C:\mysqlCerts\server-key.pem           |
+---------------+----------------------------------------+

上記のようなものがなければ、うまくいきません。証明書/キーを作成するときにパスフレーズを割り当てたのでしょうか?その場合、MySQLはパスフレーズなしでそれらを使用できません。その後、次のopensslコマンドを発行して、それを削除できます。

openssl rsa -in "C:\mysqlCerts\server-key.pem" -out "C:\mysqlCerts\server-key-ppless.pem"

次に、my.iniを再度変更して、この新しい-ppless.pem接尾辞付きファイルを指すようにします。もう一度mysqlを再起動して接続し、have_sslYESであることを確認します。それは...ですか?ステータスを表示して再確認します。

mysql> status
--------------
mysql.exe  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 46 sec

これでSSLに何かができました!新しいssluserと接続してみましょう。次に -ssl-mode フラグを使用します。

mysql.exe -ussluser -p --ssl-mode=REQUIRED

接続されれば完了です。

(ただし、再確認するには、SSLを使用せずに接続を試みて、接続が拒否されるかどうかを確認することができます:)

mysql.exe -ussluser -p --ssl=0

次に、SSL経由でコネクタを使用するようにアプリを構成する必要があります。たとえば、 。NETコネクタを使用している場合は、こちらのドキュメントを確認してください

6
user1623521