Python 3.13 + PyMySQL で MySQL にSSL接続できない

Python 3.13 を PyMySQL のCIに追加したら、次のようなエラーが発生した。

"Can't connect to MySQL server on '127.0.0.1' ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority Key Identifier (_ssl.c:1018))"

調べてみると、Python 3.13からsslモジュールがデフォルトで利用するフラグが更新されてていた。

Security improvements:

ssl.create_default_context() sets ssl.VERIFY_X509_PARTIAL_CHAIN and ssl.VERIFY_X509_STRICT as default flags.

What’s New In Python 3.13 — Python 3.13.1 documentation

MySQLの証明書は、MySQLが初回起動時に自動で生成する自己署名証明書をそのまま使っている。そこで作られる ca.pem に Authority Key Identifier が欠けていて、それを VERIFY_X509_STRICT が許さないようだ。

github.com

とりあえずPyMySQLでは当面 VERIFY_X509_STRICT を無効にしようと思う。MySQLがデフォルトでこれに対応した証明書を作ってくれるようになるまで、ユーザーにいちいち自己署名証明書を作る方法を教えるのは面倒だ。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。