- blogs:
- cles::blog

MySQL に SSL 接続できないときはキーの形式を確認すべし


Amazon RDS 上の MySQL 対しては SSL 接続を試したことがあったので、自前のサーバにも簡単に SSL 接続できるだろうと思って挑戦してみたら、変なところにはまり込んでしまったのでその顛末をメモ。
例えば MySQL Connector/ODBC を使って MySQL に SSL 接続したい場合には下記のように SSL Key や SSL Certificate、SSL Certificate Authority を設定する必要があります。
上記は一見、正しいようにみえるのですが、実際に接続しようとすると下記のような「SSL connection error: Unable to get private key (#2026)」というエラーが発生します。
キーは openssl で生成で生成しているので、壊れているはずはない・・・・・・と思っていたのですが、それが間違いの始まりでした。結論から言えば、MySQL は SSL キーの形式が PKCS#8 だと上手く接続できないことがあるようです。少なくとも MySQL-server-5.6.15-1.el6.x86_64.rpm や MySQL Connector/ODBC 5.2、MySQL Workbench 6.0 は読み込むことができませんでした(ただし CentOS 6.x 標準の mysql-server-5.1.71-1.el6.x86_64 は PKCS#8 でも問題なく動いたので、バージョンによる違いはあるみたいです。)。
これについては、既に下記でバグとして報告されています。
MySQL Bugs: #71271: MySQL fails to load PKCS#8 private key
A private key can be in PKCS#1 or PKCS#8 format.
The PKCS#1 format can be recognized as it starts with
-----BEGIN RSA PRIVATE KEY-----
The PKCS#8 format can be recognized as it starts with
-----BEGIN PRIVATE KEY-----
MySQL accepts keys in PKCS#1 format, but fails to load keys in PKCS#8 format.
キーの形式は見分けがつきにくいですが、テキストエディタで開いたときに-----BEGIN RSA PRIVATE KEY-----で始まっている場合は PKCS#1(=読み込める)、-----BEGIN PRIVATE KEY-----で始まっている場合は PKCS#8(=読み込めないことがある)という感じです。このバグを回避するためには PKCS#8 を PKCS#1 に変換するには openssl を使って下記のようなコマンドを実行すれば OK です。
くだらないことですが、だいぶ時間を食ってしまいました。
† 証明書を自動生成するスクリプト
今回はこんなスクリプトを書いて必要な証明書を自動生成するようにしていました。
make_cert.sh
openssl.cnf については CentOS 6.x の標準のものから nsCertType などを書き換えたものを使っています。
diff -u /etc/pki/tls/openssl.cnf openssl.cnf
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6405
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110794)
3 . 年次の人間ドックへ(110385)
4 . 2023 年分の確定申告完了!(1つめ)(109933)
5 . 三菱鉛筆がラミーを買収(109832)