2026年5月20日

2026年5月20日

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

はじめに

WordPressサイトでSSL証明書エラーが発生すると、訪問者のブラウザに警告が表示され、サイトへのアクセスが難しくなります。エラーコードによって原因と対処法が異なるため、適切に診断して対処することが重要です。

症状・原因

  • ブラウザに「NET::ERR_CERT_DATE_INVALID」が表示される(証明書の期限切れ)
  • 「ERR_SSL_PROTOCOL_ERROR」が表示される(プロトコル設定の問題)
  • 「NET::ERR_CERT_AUTHORITY_INVALID」が表示される(証明書チェーンの問題)
  • wp_remote_get() や cURL でSSLエラーが発生する

解決手順

ステップ1:エラーの種類を診断する

# 証明書の詳細情報を取得
echo | openssl s_client -connect example.com:443 -servername example.com 2>&1 | \
    openssl x509 -noout -text | grep -A2 "Subject\|Issuer\|Not Before\|Not After"

# 証明書チェーンを確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>&1 | \
    grep -E "Verify return code|depth|subject|issuer"

# SSL/TLSプロトコルのサポート状況を確認
openssl s_client -connect example.com:443 -tls1_2 < /dev/null 2>&1 | head -5
openssl s_client -connect example.com:443 -tls1_3 < /dev/null 2>&1 | head -5

# SSL Labs で詳細スキャン
# https://www.ssllabs.com/ssltest/analyze.html?d=example.com
# よくあるエラーコードと原因
# ERR_CERT_DATE_INVALID    → 証明書の期限切れ / PC の時刻が狂っている
# ERR_CERT_AUTHORITY_INVALID → 中間証明書が設定されていない / 自己署名証明書
# ERR_SSL_PROTOCOL_ERROR   → TLS 1.0/1.1 のみサポート / SSLの設定ミス
# ERR_SSL_VERSION_OR_CIPHER_MISMATCH → 暗号スイートの互換性問題
# ERR_CERT_COMMON_NAME_INVALID → 証明書のドメインと実際のドメインが不一致

ステップ2:証明書期限切れを修正する(ERR_CERT_DATE_INVALID)

# Let's Encrypt の場合:証明書を強制更新
sudo certbot renew --force-renewal --cert-name example.com
sudo systemctl reload apache2

# 更新後に確認
echo | openssl s_client -connect example.com:443 2>/dev/null | \
    openssl x509 -noout -enddate

# Webサーバーが新しい証明書を読み込んでいるか確認
sudo systemctl status apache2
# または
sudo apachectl configtest

ステップ3:証明書チェーンエラーを修正する(ERR_CERT_AUTHORITY_INVALID)

# 証明書チェーンを確認(depth が 0 だけなら中間証明書が不足)
echo | openssl s_client -connect example.com:443 2>&1 | grep "depth\|subject"
# depth=2: ルート証明書
# depth=1: 中間証明書
# depth=0: サーバー証明書

# Apache: fullchain.pem(証明書+中間証明書)を使用しているか確認
grep -i "SSLCertificateFile\|SSLCertificateChainFile" \
    /etc/apache2/sites-enabled/*.conf

# fullchain.pem を使用するよう修正
# SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# ※ SSLCertificateChainFile は古い Apache では必要だったが現在は fullchain.pem で対応

# Nginx: fullchain.pem を確認
grep -i "ssl_certificate" /etc/nginx/sites-enabled/*.conf
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ステップ4:TLSプロトコルエラーを修正する(ERR_SSL_PROTOCOL_ERROR)

# Apache: TLS 1.2/1.3 のみ許可
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off

# 設定テスト
sudo apachectl configtest
sudo systemctl reload apache2
# Nginx: TLS 設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

ステップ5:WordPressのwp_remote_get()でSSLエラーが出る場合

// wp-config.php または wp-includes は編集しない
// 代わりに: SSL検証エラーを診断する

// functions.php: SSL接続テスト用(デバッグ後は削除する)
add_action('admin_init', function(): void {
    if (!isset($_GET['test_ssl']) || !current_user_can('manage_options')) return;

    $response = wp_remote_get('https://api.example.com/test', [
        'timeout' => 15,
        'sslverify' => true, // 本番は必ず true
    ]);

    if (is_wp_error($response)) {
        wp_die('SSL Error: ' . $response->get_error_message());
    }

    wp_die('SSL OK: HTTP ' . wp_remote_retrieve_response_code($response));
});
// SSL検証エラーの根本原因を修正する方法

// 問題1: サーバーのCA証明書バンドルが古い
// → サーバーの ca-certificates パッケージを更新
// sudo apt update && sudo apt install -y ca-certificates

// 問題2: WordPress が使う cURL の証明書パスが間違っている
// functions.php に追加(一時診断用)
add_action('http_api_curl', function($handle): void {
    // 現在使用されているCA証明書バンドルを確認
    $info = curl_getinfo($handle);
    error_log('cURL SSL version: ' . $info['ssl_verifyresult']);
});

// 問題3: ローカル開発環境(自己署名証明書)
// → sslverify を false にするのは開発環境のみ
add_filter('https_ssl_verify', '__return_false'); // 本番では使わない
add_filter('https_local_ssl_verify', '__return_false'); // ローカルのみ

注意事項

  • sslverify = falsehttps_ssl_verifyfalse にする設定は本番環境では絶対に使わないでください。中間者攻撃のリスクが生じます。ローカル開発環境専用の対処法です
  • 証明書エラーがPC側の時刻のズレで発生している場合があります。date コマンドでサーバーの時刻を確認し、ntpdatechronycで時刻同期を行ってください
  • Cloudflare経由の場合、Cloudflareとオリジンサーバー間のSSL設定も確認が必要です

まとめ

SSLエラー診断は①openssl s_clientでエラー種別を特定、②期限切れならcertbot renew --force-renewalで更新、③チェーンエラーならfullchain.pemを使用しているか確認、④プロトコルエラーならSSLProtocol all -TLSv1 -TLSv1.1でTLS1.0/1.1を無効化、⑤PHP/cURLのSSLエラーはCAバンドルの更新またはwp_remote_get()のデバッグで原因を特定します。

お気軽にご相談ください

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