MariDB Connector/C がデフォルトでSSLを強制するようになった

MariaDB 11.4 がGAになり、SSLが自動で有効になるようになりました。合わせてMariaDB Connector/Cも3.4からデフォルトでSSLを利用し、かつサーバーの証明書を検証するようになりました。

これにより、MariaDB Connector/C 3.4以降のライブラリを利用してMySQLや古いMariaDBに接続する場合に、SSLで接続できないとか、証明書の検証に失敗するといった問題が発生するようになりました。 これらをリンクしたPythonのmysqlclientやRubyのmysql2のようなクライアントライブラリには続々と問題報告が上がってきています。

この問題に対処するいくつかの方法を紹介します。まずはConnectorをリンクしたライブラリの利用者ができることから。

  • MariaDB Connector/C 3.3を使う
  • ~/.my.cnf 等が利用されるなら、 [client] セクションに disable-ssl を書いてSSLを無効化するか、 disable-ssl-verify-server-cert を書いて証明書の検証を無効化する。
  • MariaDB Connector/C 3.4 をビルドする時のcmakeのオプションに -DDEFAULT_SSL_VERIFY_SERVER_CERT=0 を追加する。(証明書の検証をデフォルトでオフにできるだけで、SSLをデフォルトでオフにはならない) (参考)
  • MariaDB Connector/C 3.4.2 (未リリース)以降を使い、 MARIADB_TLS_DISABLE_PEER_VERIFICATION 環境変数を設定する。(同じく検証のみがオフになる)(参考)

また、MariaDB Connector/CやMySQL Connector/Cを利用するクライアントライブラリを開発している人向けのヒントも紹介します。

  • MySQLMYSQL_OPT_SSL_MODE オプションを持つが、MariaDBには存在しない。
  • MySQLは8.0で MYSQL_OPT_SSL_ENFORCE オプションを削除したが、MariaDBでは現役で、SSLの有効、無効を切り替える手段。
  • Connector/CがデフォルトでSSLを無効だという前提が崩れたので、SSLを有効にするオプションだけでなく、無効にするオプションを実装する必要がある。
    • 後方互換性やMySQLとの一貫性を考えると、ユーザーがSSL有効を指定しなかった場合は MYSQL_OPT_SSL_ENFORCE を 0 にしてSSL無効化する方法がある。
    • MariaDBの「デフォルトでセキュアに」というポリシーを尊重するのであれば、ユーザーがSSL無効化や検証無効化を明示的に指定したときに、デフォルトで無効になっている事を前提にせずちゃんと無効化するようにする。
このブログに乗せているコードは引用を除き CC0 1.0 で提供します。