クイック修正
このエラーは、ウェブサイトのセキュリティ証明書を発行した機関をブラウザが認識できないことを示しています。通常、以下の手順で解決できます。
- 本番サイト: 自己署名証明書を、Let's Encryptのようなプロバイダーが発行する有効なCA署名証明書に置き換えます。
- ローカル開発:
mkcertを使用して、ローカルマシンが実際に信頼する証明書を生成します。 - エンドユーザー: システムの時計が分単位で正確であることを確認してください。日付が正しくないと、完全に有効な証明書であっても期限切れや無効として扱われることがよくあります。
このエラーが発生する理由
HTTPS経由でサイトを読み込む際、サーバーはその身元を証明するために証明書を提示します。ブラウザは、DigiCertやSectigoといった検証済みの認証局(CA)が含まれる内蔵の「信頼済みストア(Trust Store)」と照らし合わせてこれをチェックします。発行者がそのリストにない場合、ChromeやEdgeはNET::ERR_CERT_AUTHORITY_INVALIDという警告を表示して接続をブロックします。
通常、以下の要因で警告画面が表示されます。
- 自己署名証明書: 信頼できるCAから取得するのではなく、独自の証明書を作成した場合。
- 証明書チェーンの不備: サイトをルートCAに結びつける中間証明書をサーバーが送信し忘れている場合。
- レガシーOS: Windows 7やAndroid 7.1.1などの古いシステムでは、最新のHTTPS標準に必要なモダンなルート証明書が不足している場合があります。
解決策 1: 本番環境では Let's Encrypt を使用する
公開ウェブサイトで自己署名証明書を決して使用しないでください。ユーザーを混乱させ、SEOにも悪影響を及ぼします。代わりに、Certbotを使用してLet's Encryptから無料の自動証明書をインストールしてください。このプロセスは5分もかかりません。
Nginxを実行しているUbuntuサーバーでは、以下のコマンドを使用します。
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
CertbotはNginxの設定を自動的に変更します。フル証明書チェーンに必要なパスを追加し、ブラウザがルートCAまでのパスを検証できるようにします。
解決策 2: mkcert によるプロフェッショナルなローカル開発
多くの開発者は、「詳細設定 -> 移動する」をクリックしてlocalhostでのSSLエラーを無視しています。これは、実際の設定バグを見逃す原因となる悪い習慣です。標準的なOpenSSLの自己署名証明書は、デフォルトでは信頼されません。これを正しく修正するには、mkcertを使用します。
まず、ツールをインストールします。Homebrewを使用したmacOSの場合は以下の通りです。
brew install mkcert
brew install nss # Firefoxを使用する場合に必要
次に、マシンにローカルCAをセットアップします。
mkcert -install
最後に、プロジェクト用の証明書を生成します。
mkcert localhost dev.local 127.0.0.1
これにより、localhost+2.pemとlocalhost+2-key.pemの2つのファイルが生成されます。これらを使用するようにローカルウェブサーバーを設定してください。これで、ローカルテスト時にブラウザに有効な緑色の鍵アイコンが表示されるようになります。
解決策 3: 中間証明書チェーンの修復
よくある間違いは、サーバー設定で「リーフ(末端)」証明書のみを指定することです。一部のブラウザは中間証明書をキャッシュしますが、サーバーからフルチェーンが提供されない場合、多くのブラウザでエラーが発生します。
Nginxを使用している場合は、ssl_certificateのパスを確認してください。cert.pemではなくfullchain.pemを指している必要があります。フルチェーンファイルには、自身の証明書に続いてCAの中間証明書が含まれています。
server {
listen 443 ssl;
server_name example.com;
# cert.pemではなくfullchain.pemを使用する
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
解決策 4: 古くなったクライアントの信頼済みストアの更新
サーバー側に問題がなくても、訪問者のコンピュータが古い場合があります。有名な例は、2021年9月のIdentTrust DST Root CA X3の期限切れです。これにより、数百万台の古いデバイスで突然CERT_AUTHORITY_INVALIDエラーが発生しました。
- Windowsユーザー: Windows Updateを実行してください。これにより、システムは信頼済みルート証明書のリストを強制的に更新します。
- Linuxユーザー: 最新のバンドルを確実に入手するために、CA証明書パッケージを再インストールします。
sudo apt-get install --reinstall ca-certificates sudo update-ca-certificates
- **macOSユーザー:** 特定のカスタム証明書を信頼する必要がある場合は、`.crt`ファイルを**キーチェーンアクセス**にドラッグします。ファイルをダブルクリックし、信頼設定を「**常に信頼**」に変更します。
## 修正内容の確認方法
キャッシュされたデータによって誤解を招く可能性があるため、メインのブラウザだけでテストするのは避けてください。確実な回答を得るにはコマンドラインを使用します。
**OpenSSLによるテスト:**
openssl s_client -connect yourdomain.com:443 -showcerts
出力の最後までスクロールします。`Verification: OK`と表示されれば成功です。`Verification error: self signed certificate`と表示される場合は、サーバーが依然として正しいチェーンを送信していません。
**Curlによるテスト:**
curl -vI https://yourdomain.com
SSLエラーなしでハンドシェイクが完了すれば、設定は標準に準拠しており安全です。
## 参考資料
- [2021年のルートCA期限切れについての解説](https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/)
- [GitHub上のmkcertドキュメント](https://github.com/FiloSottile/mkcert)
- [Nginx公式HTTPSガイド](https://nginx.org/en/docs/http/configuring_https_servers.html)

