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