概要
AWS BatchからRDSへアクセスしたら以下のエラーが返されました。
TLS/SSL error: self-signed certificate in certificate chain
前提
利用しているRDSは、検証環境かつVPC内部の通信のみです。
RDSのMySQLのバージョンは、MySQL 8.4.6。
AWS Batchで利用していたAMIは、amzn2-ami-ecs-hvm-2.0.20240802-x86_64-ebs。
AWS Batch側で指定しているのは、EC2 on ECSで、
Dockerイメージは、Python3.12、以下を実行してあります。
RUN apt-get update && apt-get install -y default-mysql-client && rm -rf /var/lib/apt/lists/*
原因
RDSのパラメータグループを確認すると、
require_secure_transportはengine-defaultになっていました(MySQLのデフォルトは OFF)。
なので、RDS側でSSLを強制しているわけではありません。
新しいバージョンのMySQLクライアントでは--ssl-mode=PREFERREDがデフォルトで、
サーバーがSSLをサポートしている場合はSSL接続を試みて、
RDSの証明書チェーンの検証に失敗する、ということがあるようですが、
同じようなバージョンと構成を他環境でも利用していたので、これが原因かどうかは不明...。
解決方法
ということで、原因はいまいちわかりませんが、エラーが解消された方法をシェアします。
コマンドを以下のように変更すれば、エラーはなくなり正常にバッチが実行されました。
BEFORE
mysql -h $RDS_HOST -P $RDS_PORT ...
AFTER
mysql --skip-ssl -h $RDS_HOST -P $RDS_PORT ...
検証環境であり、また、VPC内部での通信しかないため、上記で問題はないと思います。
参考
ちなみにMySQL公式クライアントでは5.7以降、--skip-sslは非推奨になっています。
Use --ssl-mode=DISABLED instead of --ssl=0, --skip-ssl, or --disable-ssl.
https://dev.mysql.com/doc/refman/5.7/en/connection-options.html
ただし、MariaDBクライアントでは --ssl-modeオプション自体が存在しないため、--skip-sslを使用するのが正しい方法とのこと。
Dockerイメージで実行していたのが、
どうやらMariaDBクライアントをインストールしていたらしく、
-
--ssl-mode=DISABLED→ 使えない -
--skip-ssl→ 使える
という状況になっていたようです。
そのため、--ssl-mode=DISABLEDで実行すると以下のエラーになりました。
mysql: unknown variable 'ssl-mode=DISABLED'