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 = falseやhttps_ssl_verifyをfalseにする設定は本番環境では絶対に使わないでください。中間者攻撃のリスクが生じます。ローカル開発環境専用の対処法です- 証明書エラーがPC側の時刻のズレで発生している場合があります。
dateコマンドでサーバーの時刻を確認し、ntpdateやchronycで時刻同期を行ってください - 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()のデバッグで原因を特定します。