2026年6月3日

2026年6月3日

WordPressのSSL証明書エラーを解決する方法

はじめに

SSL証明書エラーはサイト訪問者に警告画面を表示し、信頼性を大きく損ないます。Let's Encryptの自動更新失敗・ドメイン不一致・中間証明書の設定ミスが主な原因です。エラーの種類を特定して適切に対処します。

症状・原因

  • ブラウザに「この接続ではプライバシーが保護されません」と表示される
  • NET::ERR_CERT_EXPIRED:証明書の有効期限が切れている
  • ERR_CERT_COMMON_NAME_INVALID:証明書のドメインとサイトのドメインが一致しない
  • ERR_CERT_AUTHORITY_INVALID:中間証明書が正しく設定されていない
  • Let's Encryptの自動更新が止まっていた

解決手順

ステップ1:証明書の状態を確認する

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

# 証明書のドメイン(SAN)を確認
echo | openssl s_client -servername example.com \
    -connect example.com:443 2>/dev/null \
    | openssl x509 -noout -text \
    | grep -A1 "Subject Alternative Name"

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

# 自動更新のドライラン
certbot renew --dry-run

ステップ2:Let’s Encrypt 証明書を手動更新する

# ① certbot で証明書を更新
certbot renew

# ② 特定ドメインを強制更新
certbot renew --cert-name example.com --force-renewal

# ③ Apache の場合(certbot-apache プラグイン)
certbot --apache -d example.com -d www.example.com

# ④ Nginx の場合(certbot-nginx プラグイン)
certbot --nginx -d example.com -d www.example.com

# ⑤ webroot 方式(任意のWebサーバー)
certbot certonly --webroot \
    -w /var/www/html \
    -d example.com -d www.example.com

# ⑥ 証明書更新後にWebサーバーを再起動
systemctl reload apache2
# または
systemctl reload nginx

ステップ3:自動更新の設定を確認・修正する

# crontab で自動更新を確認
crontab -l | grep certbot

# Let's Encrypt の自動更新(systemd timer を使う場合)
systemctl status certbot.timer
systemctl enable certbot.timer

# crontab に自動更新を追加(2日に1回 AM 3:12 に実行)
echo "12 3 */2 * * root certbot renew --quiet --post-hook 'systemctl reload apache2'" \
    | sudo tee /etc/cron.d/certbot-renew

# 更新スクリプト(renewal-hooks に配置)
cat > /etc/letsencrypt/renewal-hooks/post/reload-webserver.sh << 'EOF'
#!/bin/bash
systemctl reload apache2 || systemctl reload nginx
echo "[$(date)] SSL cert renewed and webserver reloaded"
EOF
chmod +x /etc/letsencrypt/renewal-hooks/post/reload-webserver.sh

ステップ4:WordPress 側の HTTPS 設定を確認する

// wp-config.php: SSL 関連の設定
define('FORCE_SSL_ADMIN', true);

// ロードバランサー経由の場合(SSL終端がサーバー外にある場合)
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}
# DB の siteurl / home が https になっているか確認
wp option get siteurl
wp option get home

# https に更新
wp option update siteurl 'https://example.com'
wp option update home 'https://example.com'

# パーマリンクを再構築
wp rewrite flush --hard

ステップ5:中間証明書(Chain)の問題を解決する

# 中間証明書の確認
echo | openssl s_client -connect example.com:443 2>/dev/null \
    | openssl x509 -noout -issuer

# fullchain.pem を使っているか確認(Let's Encrypt の場合)
# ❌ cert.pem のみ → 中間証明書が含まれない
# ✅ fullchain.pem → ルートまでのチェーンが含まれる

# Apache の設定例
# SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

# Nginx の設定例
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

注意事項

  • Let's Encrypt証明書の有効期限は90日です。certbot renewを月2回以上実行するcron設定を必ず入れてください
  • ポート80(HTTP)がファイアウォールでブロックされているとLet's Encryptのドメイン検証(HTTP-01チャレンジ)が失敗します。証明書更新時は一時的にポート80を開放してください
  • サーバー移転後に証明書ファイルが旧サーバーに残ったままになることがあります。移転先で必ず新規発行してください

まとめ

SSL証明書エラー解決は①openssl s_clientcertbot certificatesで証明書の期限・ドメイン・発行者を確認、②certbot renew --force-renewalで手動更新しWebサーバーをリロード、③/etc/cron.d/certbot-renewで2日に1回の自動更新cronを設定、④wp-config.phpFORCE_SSL_ADMIN=true$_SERVER['HTTPS']='on'を設定しDBのsiteurl/homeをhttpsに統一、⑤Apacheはcert.pemではなくfullchain.pemを使い中間証明書チェーンを含めます。

お気軽にご相談ください

お見積りへ お問い合わせへ