MySQL では、SSL を使用した暗号化された接続をサポートするために必要な SSL 証明書およびキーファイルと RSA キーペアファイル、および暗号化されていない接続を介した RSA を使用したセキュアなパスワード交換 (これらのファイルがない場合) を作成するために、次の方法が提供されます:
MySQL ディストリビューションの場合、サーバーは起動時にこれらのファイルを自動生成できます。
ユーザーは mysql_ssl_rsa_setup ユーティリティを手動で起動できます。
RPM パッケージや DEB パッケージなどの一部の配布タイプでは、データディレクトリの初期化中に mysql_ssl_rsa_setup の起動が発生します。 この場合、openssl コマンドが使用可能であれば、OpenSSL を使用して MySQL ディストリビューションをコンパイルする必要はありません。
サーバーの自動生成および mysql_ssl_rsa_setup は、必要なファイルを簡単に生成できるようにすることで、SSL を使用したバリアの低減に役立ちます。 ただし、これらの方法で生成された証明書は自己署名されているため、あまりセキュアでない可能性があります。 このようなファイルの使用経験がある場合は、登録された認証局から証明書/キーデータを取得することを検討してください。
OpenSSL を使用してコンパイルされた MySQL ディストリビューションの場合、MySQL サーバーには、起動時に欠落している SSL および RSA ファイルを自動的に生成する機能があります。 auto_generate_certs
、sha256_password_auto_generate_rsa_keys
および caching_sha2_password_auto_generate_rsa_keys
システム変数は、これらのファイルの自動生成を制御します。 これらの変数はデフォルトで有効になっています。 これらは起動時に有効化して検査できますが、実行時には設定できません。
起動時に、auto_generate_certs
システム変数が有効で、--ssl
以外の SSL オプションが指定されておらず、サーバー側の SSL ファイルがデータディレクトリから欠落している場合、サーバーはサーバー側およびクライアント側の SSL 証明書とキーファイルをデータディレクトリに自動的に生成します。 これらのファイルにより、SSL を使用した暗号化されたクライアント接続が可能になります。セクション6.3.1「暗号化接続を使用するための MySQL の構成」 を参照してください。
-
サーバーは、次の名前の SSL ファイルのデータディレクトリをチェックします:
ca.pem server-cert.pem server-key.pem
-
これらのファイルのいずれかが存在する場合、サーバーは SSL ファイルを作成しません。 それ以外の場合は、それらに加えて追加のファイルが作成されます:
ca.pem Self-signed CA certificate ca-key.pem CA private key server-cert.pem Server certificate server-key.pem Server private key client-cert.pem Client certificate client-key.pem Client private key
サーバーが SSL ファイルを自動生成する場合は、
ca.pem
、server-cert.pem
およびserver-key.pem
ファイルの名前を使用して、対応するシステム変数 (ssl_ca
,ssl_cert
,ssl_key
) を設定します。
これらの条件がすべて満たされている場合、サーバーは起動時に RSA 秘密キー/公開キーのペアファイルをデータディレクトリに自動的に生成: sha256_password_auto_generate_rsa_keys
または caching_sha2_password_auto_generate_rsa_keys
システム変数が有効になっており、RSA オプションが指定されていません。RSA ファイルがデータディレクトリにありません。 これらのキーペアファイルを使用すると、sha256_password
または caching_sha2_password
プラグインによって認証されたアカウントに対して、暗号化されていない RSA 接続を使用したセキュアなパスワード交換が可能になります。セクション6.4.1.3「SHA-256 プラガブル認証」 および セクション6.4.1.2「SHA-2 プラガブル認証のキャッシュ」 を参照してください。
-
サーバーは、RSA ファイルのデータディレクトリを次の名前でチェックします:
private_key.pem Private member of private/public key pair public_key.pem Public member of private/public key pair
これらのファイルのいずれかが存在する場合、サーバーは RSA ファイルを作成しません。 それ以外の場合は、作成されます。
サーバーは RSA ファイルを自動生成する場合、その名前を使用して、対応するシステム変数 (
sha256_password_private_key_path
およびsha256_password_public_key_path
、caching_sha2_password_private_key_path
およびcaching_sha2_password_public_key_path
) を設定します。
MySQL ディストリビューションには、SSL および RSA ファイルを生成するために手動で起動できる mysql_ssl_rsa_setup ユーティリティが含まれています。 このユーティリティはすべての MySQL ディストリビューションに含まれていますが、openssl コマンドを使用できる必要があります。 使用手順については、セクション4.4.3「mysql_ssl_rsa_setup — SSL/RSA ファイルの作成」 を参照してください。
サーバーまたは mysql_ssl_rsa_setup の起動によって自動的に作成される SSL および RSA ファイルには、次の特性があります:
SSL および RSA キーのサイズは 2048 ビットです。
SSL CA 証明書は自己署名されています。
SSL サーバーおよびクライアント証明書は、
sha256WithRSAEncryption
署名アルゴリズムを使用して CA 証明書およびキーで署名されます。-
SSL 証明書は、適切な証明書タイプ (CA、サーバー、クライアント) で次の共通名 (CN) 値を使用します:
ca.pem: MySQL_Server_suffix_Auto_Generated_CA_Certificate server-cert.pm: MySQL_Server_suffix_Auto_Generated_Server_Certificate client-cert.pm: MySQL_Server_suffix_Auto_Generated_Client_Certificate
suffix
の値は、MySQL のバージョン番号に基づきます。 mysql_ssl_rsa_setup によって生成されたファイルの場合、--suffix
オプションを使用して接尾辞を明示的に指定できます。サーバーによって生成されたファイルの場合、CN 値が 64 文字を超えると、名前の
_
部分は省略されます。suffix
SSL ファイルには、国 (C)、都道府県 (ST)、組織 (O)、組織単位名 (OU) および電子メールアドレスの空白値があります。
サーバーまたは mysql_ssl_rsa_setup によって作成された SSL ファイルは、生成後 10 年間有効です。
RSA ファイルは期限切れになりません。
SSL ファイルには、証明書とキーのペアごとに異なるシリアル番号があります (CA の場合は 1、サーバーの場合は 2、クライアントの場合は 3)。
サーバーによって自動的に作成されたファイルは、サーバーを実行するアカウントによって所有されます。 mysql_ssl_rsa_setup を使用して作成されたファイルは、そのプログラムを起動したユーザーが所有します。 これは、プログラムが
root
によって起動され、ファイルを所有するユーザーを指定する--uid
オプションが指定されている場合に、chown()
システムコールをサポートするシステムで変更できます。Unix および Unix に似たシステムでは、ファイルアクセスモードは、証明書ファイルの場合は 644 (ワールド読取り可能) で、キーファイルの場合は 600 (つまり、サーバーを実行するアカウントによってのみアクセス可能) です。
SSL 証明書の内容を確認するには (たとえば、有効な日付の範囲を確認するには)、openssl を直接起動します:
openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem
次の SQL ステートメントを使用して SSL 証明書の有効期限情報を確認することもできます:
mysql> SHOW STATUS LIKE 'Ssl_server_not%';
+-----------------------+--------------------------+
| Variable_name | Value |
+-----------------------+--------------------------+
| Ssl_server_not_after | Apr 28 14:16:39 2027 GMT |
| Ssl_server_not_before | May 1 14:16:39 2017 GMT |
+-----------------------+--------------------------+