MySQL 5.6でリモートMySQLサーバーとSSL接続有効なレプリケーションを設定してみた。設定方法をまとめてくださっているサイトに感謝!。
MySQL で SSL での接続を有効にする一部始終(1)

ところが、設定完了後に動作確認でmysqlコマンドを確認してみたところ、SSLが有効にならない。

mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| have_openssl  | DISABLED                       |
| have_ssl      | DISABLED                       |
| ssl_ca        | /etc/mysql-ssl/ca-cert.pem     |
| ssl_capath    |                                |
| ssl_cert      | /etc/mysql-ssl/server-cert.pem |
| ssl_cipher    |                                |
| ssl_crl       |                                |
| ssl_crlpath   |                                |
| ssl_key       | /etc/mysql-ssl/server-key.pem  |
+---------------+--------------------------------+
9 rows in set (0.01 sec)

/var/log/mysqld.logを見るとエラーが表示されている。

SSL error: Unable to get private key from '/etc/mysql-ssl/server-key.pem'

調べたところ、原因が分かった。
MySQL Forums :: Install & Repo :: MySQL 5.5.8 SSL error: Unable to get private key from 'server-key.pem'

ServerのPrivateKeyファイル/etc/mysql-ssl/server-key.pemの記述が、BEGIN PRIVATE KEYではなく、BEGIN RSA PRIVATE KEYでなくてはならないらしい。
もっと調べると、この秘密鍵PEMファイルのままだと、mysql クライアントからSSL接続した場合にもエラーが発生する。

# mysql -u rep_user -p -h 192.168.1.105 --ssl-ca=/etc/mysql-ssl/ca-cert.pem
Enter password:
ERROR 2026 (HY000): SSL connection error: protocol version mismatch

ここの最下部に参考情報があった。
Got error ERROR 2026 (HY000): SSL connection error: protocol version mismatch

  • openssl 1.0 以降、秘密鍵PEMの形式はPKCS#1からPKCS#8にフォーマットが変わった。
    https://www.openssl.org/news/changelog.html

    Changes between 0.9.8n and 1.0.0 [29 Mar 2010]
    *) Make PKCS#8 the default write format for private keys, replacing the
    traditional format. This form is standardised, more secure and doesn't
    include an implicit MD5 dependency.
    [Steve Henson]

  • MySQLのSSL機能実装ライブラリ(YaSSL) がPKCS#8の秘密鍵か、BEGIN PRIVATE KEYで始まる秘密鍵をうまく扱えない。

そのため、次のopenssl rsaコマンドでフォーマットを変換する必要があるようだ。

openssl rsa -in server-key.pem -out server-key.pem

/etc/mysql-ssl/server-key.pem 修正前

-----BEGIN PRIVATE KEY-----



-----END PRIVATE KEY-----

/etc/mysql-ssl/server-key.pem 修正後

-----BEGIN RSA PRIVATE KEY-----



-----END RSA PRIVATE KEY-----

もう一度mysqlをリスタートしてみると、今度は成功したようだ。

/etc/init.d/mysqld restart
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| have_openssl  | YES                            |
| have_ssl      | YES                            |
| ssl_ca        | /etc/mysql-ssl/ca-cert.pem     |
| ssl_capath    |                                |
| ssl_cert      | /etc/mysql-ssl/server-cert.pem |
| ssl_cipher    |                                |
| ssl_crl       |                                |
| ssl_crlpath   |                                |
| ssl_key       | /etc/mysql-ssl/server-key.pem  |
+---------------+--------------------------------+
9 rows in set (0.01 sec)

クライアントから接続した際の SSL connection error: protocol version mismatch エラーも出なくなり、正常に接続できるようになった。

openssl 1.0以上でMySQLのSSL環境を作る場合はこの現象に出会うかもしれないのでメモっておこう。