`php artisan schema:dump`で `TLS/SSL`に関するエラーが出た時の対処法
前提条件
-
Docker/Docker Compose
を利用してPHP
とMySQL
の環境を構築済み。 -
MySQL
を用いてデータベースを構築済み。 - PHPサーバーに
mariadb-client v11.4以降
がインストール済み。
バージョン確認方法:/app # mysqldump --version mysqldump: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb-dump' instead mysqldump from 11.4.4-MariaDB, client 10.19 for Linux (aarch64)
エラー内容
php artisan schema:dump
を実行すると、以下のエラーが発生しました。
mysqldump: Got error: 2026: TLS/SSL error: Certificate verification failure: The certificate is NOT trusted. when trying to connect
schema:dump
コマンドは、裏側でmysqldump
コマンドを使用して、DBサーバーとの通信を行います。このエラーは、mysqldump
がPHPサーバーとDBサーバー間のTLS接続を試みた際に、DBサーバーの証明書を「信頼できない」と判断した場合に発生します。
原因
MariaDB 11.4以降
では、クライアントとサーバー間の通信がデフォルトでTLS(SSL)によって暗号化されるようになりました。
この変更により、サーバー証明書の検証が行われ、適切な証明書が設定されていない場合、接続時に今回のエラーが発生したと考えています。
対処法
今回のケースでは、ローカル環境でdumpを取得することが目的だったため、サーバー証明書の検証を無効化することでエラーを回避しました。
設定方法
MySQLの設定ファイルに以下の設定を追加します。
[client-mariadb]
disable-ssl-verify-server-cert
次に、この設定ファイルをPHPサーバーとMySQLサーバーの両方に適用するよう、Dockerの設定を変更します。
php:
...
volumes:
- ./docker-assets/mysql/custom.cnf:/etc/my.cnf.d/custom.cnf
...
mysql:
...
volumes:
- ./docker-assets/mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf
...
これで、php artisan schema:dump
を実行した際のエラーは解消されました。
他の方の助けになれば幸いです。。
注意点
この設定を有効にすると、サーバー証明書の検証が無効化されます。そのため、暗号化されている通信でも中間者攻撃(Man-in-the-Middle Attack)のリスクが高まります。悪意のある第三者が通信を傍受したり、改ざんする可能性があるため、本番環境でこの設定を使用することは避けてください。
その他の方法
今回の対応は簡易的な解決策としてサーバー証明書の検証を無効化しましたが、以下の方法でもエラーを解消できる可能性があります。
1. MySQLサーバーからCA証明書を取得する
サーバー管理者に問い合わせるか、MySQLサーバーの設定ファイル(my.cnfなど)を確認して、使用されているCA証明書(ca.pem)を取得します。
2. CA証明書をPHPサーバーに配置する
PHPサーバーにCA証明書を保存し、mysqldumpが証明書を利用できるように設定します。
3. MySQL設定にCA証明書を指定する
取得したCA証明書を以下のように設定ファイルに指定します。
[client-mariadb]
ssl_ca = /path/to/ca.pem
ssl-verify-server-cert
これにより、DBサーバー証明書の検証が行われ、エラーを回避できるはずです。
また時間を見つけて、検証してみます。
参考資料
Discussion