🤪

`php artisan schema:dump`で `TLS/SSL`に関するエラーが出た時の対処法

2025/02/03に公開

前提条件

  • Docker/Docker Composeを利用してPHPMySQLの環境を構築済み。
  • 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)によって暗号化されるようになりました。
この変更により、サーバー証明書の検証が行われ、適切な証明書が設定されていない場合、接続時に今回のエラーが発生したと考えています。

https://mariadb.com/kb/en/securing-connections-for-client-and-server/#:~:text=MariaDB starting with 11.4¶


対処法

今回のケースでは、ローカル環境でdumpを取得することが目的だったため、サーバー証明書の検証を無効化することでエラーを回避しました。

設定方法

MySQLの設定ファイルに以下の設定を追加します。

custom.cnf
[client-mariadb]
disable-ssl-verify-server-cert

次に、この設定ファイルをPHPサーバーとMySQLサーバーの両方に適用するよう、Dockerの設定を変更します。

docker-compose.yml
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証明書を以下のように設定ファイルに指定します。

custom.yml
[client-mariadb]
ssl_ca = /path/to/ca.pem
ssl-verify-server-cert

これにより、DBサーバー証明書の検証が行われ、エラーを回避できるはずです。
また時間を見つけて、検証してみます。

https://mariadb.com/kb/en/securing-connections-for-client-and-server/#:~:text=To enable one-way TLS manually

参考資料

https://mariadb.com/kb/en/securing-connections-for-client-and-server/

https://github.com/laravel/framework/issues/54269

Studio Tech Blog

Discussion