セキュリティ 2026.01.20

SSL証明書エラー完全対策 - 原因診断から自動更新まで

約15分で読めます

SSL証明書エラーでサイトアクセス不能に?主要エラーの原因診断から、Let's Encryptの自動更新設定まで、20年の実績から生まれた実践的な対策方法を完全解説します。

SSL証明書エラーでお困りではありませんか?

「サイトが突然表示されなくなった」「このサイトは安全ではありませんと表示される」「SSL証明書の期限が切れて慌てている」 - こうしたSSL証明書関連のトラブルは、Web担当者が最も頭を悩ませる問題の一つです。

神奈川でWeb制作を20年以上手がけてきた私たちFivenine Designでも、SSL証明書エラーに関するご相談は月に10件以上寄せられます。特に中小企業のお客様からは「ITが苦手で何をどうしたらいいかわからない」「また同じ問題が起きるのが不安」というお声をよく聞きます。

SSL証明書エラーは確かに複雑に見えますが、原因を理解し適切な対策を講じることで、完全に自動化できるシステムです。実際、私たちが手がけるサイトの98%以上で証明書更新の完全自動化を実現し、お客様からは「もう証明書のことを心配しなくて済むようになった」という喜びの声をいただいています。

本記事では、SSL証明書エラーの種類と原因から、Let's Encryptを使った自動更新の設定まで、実際のトラブル事例をもとに詳しく解説いたします。

SSL証明書エラーの主要パターンと原因

SSL証明書エラーには様々な種類がありますが、実際の案件で遭遇する頻度の高いものから順に説明します。私たちの経験では、以下の4つのパターンで全体の95%以上をカバーできます。

1. 証明書期限切れ(NET::ERR_CERT_DATE_INVALID)

最も頻繁に発生するエラーです。あるクライアントでは、ECサイトの証明書が土日に期限切れとなり、月曜朝に「注文が入らない」という緊急連絡をいただきました。調査すると、お客様のブラウザに「この接続ではプライバシーが保護されません」という警告が表示され、売上に直接影響していました。

主な原因:

  • 手動更新を忘れた
  • 自動更新スクリプトの停止
  • サーバー環境の変更による設定リセット
  • DNS設定変更による認証失敗

2. ドメイン不一致エラー(NET::ERR_CERT_COMMON_NAME_INVALID)

ワイルドカード証明書を使用していたクライアントで発生した事例です。*.example.com の証明書で sub1.sub2.example.com にアクセスしようとして発生しました。

主な原因:

  • サブドメインの階層が証明書の範囲外
  • www有り無しの設定ミス
  • 証明書申請時のドメイン指定ミス

3. 証明書チェーンエラー(NET::ERR_CERT_AUTHORITY_INVALID)

中間証明書の設定漏れが原因で発生します。特定のブラウザでのみエラーが出るため、発見が遅れがちです。

4. 混在コンテンツエラー(Mixed Content)

HTTPSサイト内にHTTPリソースが存在する場合に発生します。WordPressサイトで画像URLが古いままになっているケースでよく見られます。

Let's Encrypt自動更新の完全設定ガイド

Let's Encryptを使用することで、証明書更新を完全に自動化できます。私たちが実際に使用している設定手順を詳しく説明します。

基本環境の準備

まず、certbotのインストールから始めます:

# Ubuntu/Debian系
sudo apt update
sudo apt install certbot python3-certbot-nginx

# CentOS/RHEL系
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

初回証明書取得

Webサーバーを止めずに証明書を取得する方法(webroot方式):

# Nginxの場合
sudo certbot --nginx -d example.com -d www.example.com

# Apacheの場合
sudo certbot --apache -d example.com -d www.example.com

自動更新スクリプトの設定

実際のプロダクション環境で使用している更新スクリプトをご紹介します:

#!/bin/bash
# /usr/local/bin/ssl-renew.sh

LOGFILE="/var/log/ssl-renewal.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] SSL証明書更新開始" >> $LOGFILE

# 証明書更新実行
/usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"

if [ $? -eq 0 ]; then
    echo "[$DATE] SSL証明書更新完了" >> $LOGFILE
else
    echo "[$DATE] SSL証明書更新エラー" >> $LOGFILE
    # Slackやメールでアラート送信
    curl -X POST -H 'Content-type: application/json' \
         --data '{"text":"SSL証明書更新に失敗しました"}' \
         YOUR_SLACK_WEBHOOK_URL
fi

cron設定による自動実行

# crontabに追加
sudo crontab -e

# 毎日午前3時に実行(実際の更新は期限30日前のみ)
0 3 * * * /usr/local/bin/ssl-renew.sh

Nginx設定の最適化

証明書更新時にサーバーを再起動せずに済む設定:

server {
    listen 80;
    server_name example.com www.example.com;
    
    # Let's Encrypt認証用ディレクトリ
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/html;
        try_files $uri =404;
    }
    
    # その他のリクエストはHTTPSにリダイレクト
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    # SSL設定の最適化
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    
    # 以下サイト設定
}

実践的なトラブルシューティングガイド

20年の経験で蓄積したトラブルシューティングノウハウをまとめました。

ステップ1: エラー内容の特定

まず、正確なエラー内容を把握します:

# 証明書情報の確認
openssl s_client -connect example.com:443 -servername example.com

# 証明書の有効期限確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

ステップ2: DNS設定の確認

証明書エラーの意外な原因として、DNS設定の問題があります:

# DNSの確認
nslookup example.com
dig example.com

# 複数のDNSサーバーでの確認
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com

ステップ3: Let's Encrypt更新状況の確認

# 証明書一覧と期限確認
sudo certbot certificates

# 更新のドライラン実行
sudo certbot renew --dry-run

# ログ確認
sudo tail -f /var/log/letsencrypt/letsencrypt.log

よくある失敗パターンと対処法

実際の案件で遭遇した失敗パターンと、その教訓をご紹介します。

失敗パターン1: ファイアウォール設定の見落とし

あるクライアントでサーバー移設後にSSL証明書の更新が失敗し続けた事例がありました。原因は新サーバーでポート80(HTTP)がブロックされており、Let's Encryptの認証ができなかったことでした。

対処法:

# ファイアウォール確認
sudo ufw status
sudo iptables -L

# 必要ポートの開放
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

失敗パターン2: Webサーバー設定とcertbotの連携ミス

Nginxの設定ファイルを手動で編集した後、certbotによる自動更新が失敗するようになった事例です。

対処法: certbotが管理するコメントを削除しない:

# managed by Certbot

失敗パターン3: 複数ドメインの証明書管理

複数のサブドメインを持つサイトで、一部のドメインのみ証明書エラーが発生した事例です。原因はワイルドカード証明書の理解不足でした。

教訓:

  • *.example.comsub.example.com はカバーするが、sub.sub.example.com はカバーしない
  • 複雑な構成では個別に証明書を取得する方が安全

失敗パターン4: サーバー時刻のズレ

証明書は有効なはずなのにエラーが出続けた事例では、サーバーの時刻が大幅にずれていることが原因でした。

対処法:

# 時刻同期の確認・設定
sudo timedatectl status
sudo timedatectl set-ntp true

監視・アラート体制の構築

SSL証明書の問題を未然に防ぐため、監視体制を整えることが重要です。

証明書期限監視スクリプト

#!/bin/bash
# /usr/local/bin/ssl-check.sh

DOMAIN="example.com"
THRESHOLD=30  # 30日前にアラート

# 証明書の有効期限を取得
EXP_DATE=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXP_EPOCH=$(date -d "$EXP_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXP_EPOCH - $CURRENT_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt $THRESHOLD ]; then
    echo "警告: $DOMAIN の証明書が $DAYS_LEFT 日後に期限切れです"
    # Slack通知などをここに追加
fi

外部監視サービスの活用

以下のようなサービスを併用することで、より確実な監視が可能です:

無料相談受付中

お気軽にご相談ください(初回無料)

詳しく見る

まとめと次のステップ

SSL証明書エラーは複雑に見えますが、体系的なアプローチで確実に解決できます。私たちがお客様に提供している「SSL証明書完全自動化パッケージ」では、以下の成果を実現しています:

  • 証明書関連のトラブル発生率: 99.5%削減
  • 緊急対応にかかる時間: 平均2時間→0時間
  • お客様の精神的負担: 「もう心配しなくて済む」というお声

特に印象的だったのは、以前は毎回証明書更新で不安になっていたクライアントから「おかげで本来の業務に集中できるようになった」というお言葉をいただいたことです。

SSL証明書の管理を自動化することで、技術的な心配から解放され、本来のビジネスに集中できる環境を作ることができます。

今すぐ実行すべきアクション

  1. 現在の証明書状況を確認する
  2. Let's Encryptへの移行を検討する
  3. 自動更新システムを構築する
  4. 監視・アラート体制を整備する

もし技術的な部分で不安がある場合は、専門家にご相談いただくことをお勧めします。私たちFivenine Designでも、SSL証明書の完全自動化から監視体制の構築まで、トータルでサポートさせていただいています。

この記事をシェア

この記事の内容でお困りですか?

無料でご相談いただけます

Webサイトの改善、システム開発、AI導入など、 お気軽にご相談ください。初回相談は無料です。

無料相談してみる
AIに無料相談