はじめに
AWS RDS (MySQL) に TLS/SSL 経由で接続しようとした際に発生するエラーについて、原因と対策をまとめました。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
特に、証明書の検証エラーが発生する場合の対応方法を詳しく解説します。
書こうと思ったきっかけ
このエラーは MySQL を RDS に接続する際に頻繁に発生し、解決方法が分かりにくいことが多いため、具体的な手順を整理しておくことが重要だと感じました。
また、環境によって適切な対処方法が異なるため、選択肢を提示する形でまとめました。
エラーの概要
ERROR 2026 (HY000): TLS/SSL error: Certificate verification failure: The certificate is NOT trusted.
このエラーは、AWS RDS (MySQL) に TLS/SSL 経由で接続しようとした際に、証明書の検証に失敗したことを示しています。
解決策
エラーを解決するには、以下の3つの方法があります。
1. TLS/SSL 証明書のチェックを無効化する
MySQL に接続する際に --ssl-mode=DISABLED
オプションを指定することで、証明書の検証をスキップし、非SSL接続を試みることができます。
実行コマンド
/app # mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl-mode=DISABLED $MYSQL_DB
この方法は、RDS が内部ネットワークで動作している場合に有効であり、セキュリティ上問題がないことが多いです。
2. 正しい RDS の CA 証明書をダウンロードして利用する
もし TLS/SSL 接続が必須の場合は、AWS 公式の CA 証明書をダウンロードし、それを指定して接続する必要があります。
証明書のダウンロード
wget -O /app/rds-ca.pem https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
証明書を指定して MySQL に接続
/app # mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl-ca=/app/rds-ca.pem $MYSQL_DB
この方法により、正しく TLS/SSL 接続が確立されます。
3. MariaDB クライアントではなく MySQL クライアントを使用
Alpine Linux では mysql-client
が MariaDB クライアントになっているため、mariadb
コマンドを使うと解決する場合があります。
MariaDB クライアントで接続
/app # mariadb -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW $MYSQL_DB
また、MySQL 公式クライアントを利用したい場合は、追加のリポジトリから取得する必要があります。
どの方法を選ぶべきか?
方法 | メリット | デメリット |
---|---|---|
--ssl-mode=DISABLED を使用 |
すぐに簡単に接続できる | TLS/SSL を使用しない |
RDS の CA 証明書をダウンロード | 正しい TLS/SSL 設定ができる | 証明書の管理が必要 |
mariadb コマンドを使用 |
追加の証明書が不要 |
mysql コマンドが使えない |
まとめ
すぐに試すなら --ssl-mode=DISABLED
/app # mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl-mode=DISABLED $MYSQL_DB
TLS/SSL を有効にするなら AWS の証明書をダウンロード
wget -O /app/rds-ca.pem https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl-ca=/app/rds-ca.pem $MYSQL_DB
MariaDB クライアントを使う場合
/app # mariadb -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW $MYSQL_DB
最も簡単な解決策は --ssl-mode=DISABLED
を指定する方法 なので、まずはこれを試してみるのが良いでしょう!