シンフリーサーバとCloudFlareを共存させたい/CloudFlare526エラーをOrigin CA証明書なしでなんとかする

# 記事内容

今回は
「CloudFlareの526エラーを修正したい」
「シンフリーサーバーでCloudFlareを使いたい」
「シンフリーサーバーで"無料独自SSL"を更新できない場合」
「サーバーのダウン通知を受け取りたい」
の4点を解説します。

# CloudFlareの526エラーを修正したい

サイトにアクセスしたときにたまにあるこのエラー
![526-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668884/3c1ced41-94b5-4f33-8840-b4f3aec8999e.png)
CloudFlareとサーバーの通信がうまくいっていないエラーです。

- サーバーは電源が入っているか(pingでIPアドレス入れてなんか帰ってくる?)
- ドメインは割り当てられているか
- SSLは期限を過ぎていないか

を確認してください。

修理方法は後述。

# シンフリーサーバーでCloudFlareを使いたい

シンフリーサーバー(旧:Xfree)は無料で使えちゃう便利なサーバーです。
ほかのレンタルサーバ(または自作)から移行しないと申し込めないのですが、GithubPagesを使えば突破できます。

さて、シンフリーサーバーは正式にはCloudFlareをサポートしていませんが、実は普通に行けちゃいます。

CloudFlareのアカウント作って、DNSをうんぬんしたら接続完了！

とはいえ、そういうことをするとシンフリーサーバーの"無料独自SSL"が更新できなくて526エラーがやがて発生します。
今回はその事象の解決策を忘備録にするために、4本立ての記事なんです。

# シンフリーサーバーで"無料独自SSL"を更新できない場合
シンフリーサーバー(とかほかにもいろいろ?)は独自にSSLを準備してくれるのですが、そういうのは大体CloudFlareを入れると自動更新に失敗します。

~~~
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【シンフリーサーバー】■重要■ [無料独自SSL]SSLサーバー証明書
 (abellate.net) 更新未完了のお知らせ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

シンアカウントID ： hogehoge
メールアドレス　　　： hogehoge@gmail.com

平素は当サービスをご利用いただき誠にありがとうございます。
シン/wpX カスタマーサポートでございます。


サーバーID「hogehoge」で利用中の下記SSLサーバー証明書に関し、
当サポートで有効期限の延長をするための更新作業を行いましたが、
正常に完了することができませんでした。

────────────────────
■SSL更新情報

【SSLブランド】　 ： Let's Encrypt
【独自IPアドレス】： -
【サーバーID】　　： hogehoge
【コモンネーム】　： www.abellate.net
【サイトURL】　　 ： https://abellate.net/
【有効期限日】　　： hogehoge年hoge月huga日
────────────────────
~~~

みたいなのがメールで来て、ほっとくと期限が切れて526エラーです。

これって、CloudflareにDNSを割り当てちゃったので発生した問題なので、一時的にCFを外して手動で更新すれば治ります。

<br>

まずCloudFlareに入って、開発モードを有効にします。
これによりキャッシュを考えなくてよくなります。
![スクリーンショット 2025-05-02 225139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668884/13e2258b-314e-4d40-af31-edb3e45df6e4.png)

DNS\DNSレコード のページを開き、オレンジの雲がある「プロキシ済み」のやつ(今回は3つ)を編集し、一時的にプロキシを無効化します。
![スクリーンショット 2025-05-02 225200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668884/431231a5-deb7-4780-9f74-cf2d1fd0898f.png)

プロキシステータスのトグルを無効にして、一時的にCloudFlareを無効にします。
レコード消してもいいですけど、消した場合あとでめんどくさくなります。
![スクリーンショット 2025-05-02 225211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668884/c4d6b3f3-3653-4fc0-a6d5-8d4c022556bb.png)

あとはレンタルサーバーの指示に従って証明書を更新しましょう。
エラーが出た場合数分待つといいです。
![スクリーンショット 2025-05-02 210726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668884/386b4089-9dba-4a2b-ab71-2c0012e8e4d4.png)

発行されたら、
- サイトにアクセスできることを確認して
- シークレットモードのChrome(キャッシュがない)でアクセスできることを確認して
- 友達 or curlに頼んで別環境でもアクセスできることを確認して

から、CloudFlareの設定を戻しましょう。

開発モードは数日で自動で外れるので無視していいですが、DNS(トグルのほう)は戻さないとCloudFlareのご加護がないままです。

# サーバーのダウン通知を受け取りたい

リアルタイム通知は私にはできませんが、ダウンしたのをPCログイン時に知るのはできます。

具体的には、実際にアクセスしてみてHTTPステータスで確認します。

サンプルコードはPythonと.batで用意しました。
"shell:startup" フォルダに投げ込めばPCが起動するごとに確認できますよ。
(Pythonスクリプトはそのまま入れてもダメなので、.batからstartしてください。)

## Python版
- 3.13で確認
- requestsを使用します。ない場合pipしてください
- 問題ない場合は何も残さず終了します
- エラーがあった場合は集計後にWindowsのダイアログでエラーなURLのリストを表示します
~~~python
import requests
import ctypes
import sys

URLS = [
#検証対象を入れる
    "https://abellate.net",
    "https://anepad.abellate.net",
    "https://abatbeliever.net",
    "https://hspland.net",
    "https://gangangansoku.jp"
]

errors = []

for url in URLS:
    try:
        response = requests.get(url, timeout=10)
        if response.status_code != 200:
            errors.append(f" {url} → HTTP {response.status_code}")
    except requests.exceptions.SSLError:
        errors.append(f"[FAIL] {url} → SSLエラー\n")
    except requests.exceptions.RequestException as e:
        errors.append(f"[FAIL] {url} → 接続失敗\n")

if errors:
    msg = "\n".join(errors)
    ctypes.windll.user32.MessageBoxW(0, msg, "One or more URLs are dead", 0x30)
    # 0x30 = MB_ICONWARNING
    sys.exit(1)
else:
    sys.exit(0)
~~~
~~~
start /min python.exe C:\~~~hogehoge.py
~~~

## .bat版
- Windows11で確認。
- curlを使用します。ない場合curlをダウンロードしてSystem32に投げてください
- 問題ない場合は終わり次第終了します(callした場合セッションは残ります)
- 問題ある場合、エラーのURLを列挙しpause>nulで停止します。なんかキー押すと閉じちゃうので注意！

~~~bat
@echo off
setlocal enabledelayedexpansion

rem 下記にURLを空白区切りで入力。このコメントアウトは実行時に消すかANSIにしてね
set URLS=https://abellate.net https://anepad.abellate.net https://abatbeliever.net https://hspland.net https://gangangansoku.jp
set ERROR=0

echo WebSite Check

for %%U in (%URLS%) do (
    curl -s -I %%U >nul
    if errorlevel 1 (
        echo [FAIL]: %%U
        set ERROR=1
    ) else (
        echo [PASS]: %%U
    )
)

if "!ERROR!"=="1" (
    echo.
    echo One or more URLs are dead
    pause >nul
) else (
    echo.
    echo System All Green
    exit /b 0
)

~~~
さて、
~~~
setlocal enabledelayedexpansion
~~~
は魔境なので使いたくないけど、なんか動いてるのでいいでしょう。