【サーバ】「Cloudflare ERR_SSL_PROTOCOL_ERROR HTTPS SSL ネームサーバー 遅い」でお困りの方へ
今まで謙遜していたCloudflareをお仕事で導入したのですが、色々とカオスでした。既にHTTPS(SSL)で稼働中のサイトにCloudflareを導入する場合は特に注意です。また、既に設定中のDNSやネームサーバー名は、変更する前にバックアップしておきましょう。
稼働中のHTTPS(SSL) サイトが数時間「ERR_SSL_PROTOCOL_ERROR」エラーになる
ダウンタイムが無いと言われていたCloudflareですが、あくまでhttp通信の場合であって、SSLが適用されるまでは結構時間がかかるようです。
最悪の場合は24時間(4日以上かかると言ってる人も)も表示されないということになるので、リリース前のサイトならいいですが、既にHTTPSで稼働中のサイトだと致命的です。受託などで導入する場合は事前アナウンスなど必須です。
DNSエラーのような形なので、よくある「メンテナンス中」という表示も出せません。ブラウザ標準のエラー画面に「ERR_SSL_PROTOCOL_ERROR」と表示されるだけで、こちらとしては制御できません。どうしてもやるなら深夜早朝など人が少ない時間に…。
ネームサーバーは簡単に戻せない(反映に時間がかかる)
「やべぇトラブった!一旦Cloudflare止めて日を改めよう。。。」
一度Cloudflareが浸透してしまったら、元のネームサーバーへ戻しても、反映されるまで24時間〜48時間ぐらいかかる場合があるそうです。自分の場合はiPhoneなどでは数時間後に戻りましたが、MacはDNSキャッシュ消しても8時間以上そのままでした。。
もしトラブった場合、残念ですが元に戻すより、急いで修正した方が早いかもです。
Cloudflareでドメインを追加する際、ネームサーバーは「*.ns.cloudflare.com」以外にする
最初からネームサーバーを「*.ns.cloudflare.com」に設定しているドメインを、新しくCloudflareへ追加した場合、StatusがPending中のまま動かないかもしれません。ネームサーバーは正しく設定されているので、本当はActiveになるはずですが。
これはCloudflareの不具合なのかな?ドメインを追加したり削除したり繰り返している際にやりがちですね。Cloudflareから一度サイトを削除し、ネームサーバーを元に戻して無事に浸透してから、改めてCloudflareにサイトを登録しましょう。
Scan DNS Records(スキャン)は信頼しない
これはCloudflareが辞書ツールのようなもので調べて掲載しているようですので、不足しているサブドメインなど結構多いと思います。必ず確認しましょう。
SEO的な理由でSSL入れてる場合はFlexibleで
自分はletsencryptをサーバに入れて、とりあえずSSLを使ってました。CloudflareのSSLはFlexibleやFullなどありますが、セキュリティ的な理由が薄い場合はFlexibleで十分。
理由としては、二重も暗号化することになるのでパフォーマンスが悪くなるのでは?という点ですかね。お問い合わせフォームなど個別に設定する分はいいかもですが。
そもそも高額なSSL証明書を購入して運営しているサービスの場合、Cloudflareは使わない方が良いかもしれませんね。Cloudflareのビジネス版またはエンタープライズ版(有料)で、自分のSSLをアップロードするなら問題ないでしょうが。
WordPressが調子悪い
wp-config.php上部に以下記載
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
//HTTP→HTTPSへリダイレクトする場合は以下も追加
if(!$_SERVER['HTTPS']) {
header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: https://".$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
exit;
}
「email protected」みたいなのが出る
「Scrape Shield」→「Email Address Obfuscation」をオフにしておきましょう。
HTTPS(SSL)対応した時に無限ループになる
クラウドフレアはリダイレクト設定もキャッシュするようです。肝なのが、HTTP と HTTPS で別々の処理を入れていたとしても、同一のものをキャッシュするということ。
例えばサーバ側で、HTTPのときはHTTPSへリダイレクトするという処理を入れていた場合、HTTPSへリダイレクトという処理自体がキャッシュされてしまうため無限ループとなります。最初にHTTPSを叩いた場合はちゃんと表示されるので発見が遅れました。
Crypto の 「Always use HTTPS」 を ON にしつつ、Caching の 「Browser Cache Expiration」 を Respect Existing Headers にした上で、HTTP→HTTPSしてる処理の部分に以下を追加しておきましょう。
//CFでリダイレクトがキャッシュされる問題を解決
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
//ここからリダイレクト処理
header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"], true, 301);