第26章:CaddyのローカルHTTPSを使ってみる🌟🔒
この章は「ローカルの *.localhost でも HTTPS にしたい!」を、**Caddyの自動HTTPS(ローカル用)**でサクッと実現する回です🧁✨
(本番の証明書運用はまた別物だけど、開発で詰まりやすい“HTTPS必須機能”を動かすにはこれが超強い💪)
1) 今日のゴール🎯
https://hello.localhostにアクセスして、🔒が付いた状態で表示できる- その仕組み(CaddyのローカルCA)をざっくり理解できる
- 既存の
app1.localhost/api.localhostにも同じ考えで適用できる
Caddyは、公開DNS名ならACME(例:Let’s Encrypt等)で証明書を取ってくれるし、localhost やローカル/内部名にはローカル用の証明書を自動で用意してくれます🔧✨(HTTP→HTTPSリダイレクトも自動)(Caddy Web Server)
2) まず超重要:ローカルHTTPSの“正体”🧠🔍
ローカルHTTPSはこういう仕組みです👇
- Caddyが 「ローカル用の認証局(CA)」 を自分のPC用に作る
- そのCAで
hello.localhost用の証明書をサインする✍️ - あとはブラウザ側がそのCAを「信頼する」ように登録すれば、🔒で通る!
Caddyは最初にCAを作ったとき、OSの信頼ストアへ入れようとします(入ると証明書発行者が “Caddy Local Authority” みたいな名前で見える)(Caddy Web Server) ただし Dockerコンテナ内で動かしてると、Windows側の信頼ストアには自動で入れられないことが多いので、手動でroot証明書をコピーしてWindowsにインポートします🪄(Caddy Web Server)
3) まずは最小構成で「HTTPSできた!」を作る🚀🍞
以下の2ファイルだけ作ります✍️(場所はどこでもOK)
compose.yml
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
ポイント:
80と443を開ける(HTTP→HTTPSの自動リダイレクトにも使う)(Caddy Web Server)caddy_dataを必ず永続化!(ここにローカルCAや証明書が入る)🧠- 公式イメージでも
/dataと/configの永続化が推奨です(Docker Hub)
Caddyfile
hello.localhost {
respond "Hello HTTPS 🎉" 200
tls internal
}
tls internal は「公開CAじゃなく、ローカルCAで出してね👍」の合図です🔒(Caddy Web Server)
4) 起動してアクセスしてみる🐳▶️🌐
VS Codeのターミナル(PowerShell)で:
docker compose up -d
docker compose logs -f caddy
次にブラウザで:
https://hello.localhost
ここで最初は 警告が出るのが普通です😇 まだ Windows が “CaddyのローカルCA” を信頼してないからね。
5) Windowsに「CaddyのローカルCA(root.crt)」を信頼させる🪟🔐
5-1) root.crt をコンテナから取り出す📤
Caddyのroot証明書はストレージ配下にあります(Dockerだと /data/... にいることが多い)(Caddy Web Server)
まずコピー:
docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt .\caddy-local-root.crt
もしパスが違って失敗したら、コンテナ内で探せばOK👌
docker compose exec caddy sh -lc "find /data -name root.crt -print"
5-2) インポート方法は2つ(どっちでもOK)✅
A. GUIで入れる(わかりやすい・確実)🖱️
caddy-local-root.crtをダブルクリック- 「証明書のインストール」
- 「証明書をすべて次のストアに配置する」
- Trusted Root Certification Authorities(信頼されたルート証明機関) を選んで完了 この流れは Microsoft の手順でも同じです(Microsoft Learn)
B. コマンドで入れる(サクッと派)⌨️
Caddy公式ドキュメントでも certutil 例が載ってます(Caddy Web Server)
certutil -addstore -f "ROOT" .\caddy-local-root.crt
※管理者権限の有無やポリシーで弾かれることがあるので、その場合はA(GUI)が安定です🙂
6) もう一回アクセスして🔒を確認🎉🔒
ブラウザをいったん全部閉じて(ウィンドウごと!)開き直してから、
https://hello.localhost
これで警告が消えて🔒になれば勝ち!🏆 ブラウザは証明書状態をキャッシュしてハマることがあるので、再起動が効きます😺(Caddy Community)
7) ここで“ありがち詰まり”を先に潰す辞典📕🧯
パターンA:まだ ERR_CERT_AUTHORITY_INVALID 😭
原因トップ3👇
-
root.crt を違うストアに入れた → 「信頼されたルート証明機関」に入ってるか確認(Microsoft Learn)
-
/data を永続化してなくて、CAが作り直されてる →
caddy_dataを消すと別CAになって“また警告”になります(だから永続化必須)(Caddy Community) -
Dockerだから自動で信頼ストアに入れられない(それが普通) → 手動インポートが正解ルートです(Caddy Web Server)
パターンB:Chrome/EdgeはOKなのにFirefoxだけ警告🦊⚠️
Firefoxは独自の証明書ストア運用になりがちで、OS側を見ない設定のことがあります😇 対処は2択:
- Firefoxに「OSのルート証明書を信頼させる」設定をON
(
security.enterprise_roots.enabled/ImportEnterpriseRootsなど)(Mozilla サポート) - もしくは Firefox の証明書管理画面に root.crt を直接インポート
パターンC:https://hello.localhost が開けない(接続できない)🌪️
- 443が別アプリに取られてるかも
→ まず
docker compose psとdocker compose logs -f caddyを見る👀 - 企業PCのセキュリティでローカルCA追加が制限されてるかも → GUIが通らないなら、次章の mkcert方式(別アプローチ)を使うと突破できる場合があります🪄
8) 既存のリバプロ構成へ適用する(実戦)⚔️✨
今までの app1.localhost / api.localhost でも、やることは同じです👇
app1.localhost {
reverse_proxy app1:3000
tls internal
}
api.localhost {
reverse_proxy api:3000
tls internal
}
- 入口は
443(HTTPS) tls internalでローカルCAに統一- 80→443の誘導はCaddyが自動でやってくれます(Caddy Web Server)
9) “信頼”の注意点(怖がらなくてOK、でも知っておく)🧯🙂
ルートCAを信頼する=「このCAがサインした証明書は全部信頼する」なので、自分の開発PCで自分が管理できる範囲で使うのが基本です。 CaddyのローカルCAは信頼ストアから外すこともできます(Caddyは信頼ストアへ入れる/外すコマンドも用意してます)(Caddy Web Server)
10) AIに頼むと爆速になるプロンプト例🤖⚡
① 既存のCaddyfileを“HTTPS対応に直して”
- 「
app1.localhostとapi.localhostをtls internalでHTTPS化して、HTTP→HTTPSの挙動も崩さないCaddyfileにして。WebSocketもある前提で注意点をコメントに入れて」
② まだ警告が出るときの切り分け
- 「Docker上のCaddyで
tls internalを使ってる。Windowsでroot.crtをインポートしたのに警告が消えない。考えられる原因を優先度順にチェックリスト化して」
③ “/data消してしまった…”事故復旧
- 「Caddyの
caddy_dataを消してしまった。CAが変わって警告が復活した。安全に復旧する手順(再インポートやブラウザキャッシュ含む)を書いて」
11) ミニ課題🎒✨(10分で終わる)
admin.localhostを追加して、respondで別メッセージを返してみよう😺docker compose down→up -dしても 🔒 が維持されるか確認しよう(維持されないなら /data永続化が怪しい)🔍(Caddy Community)- Firefoxを使ってるなら、OSルートを信頼する設定をONにできるか確認してみよう🦊(Mozilla サポート)
ここまでできたら、次章(mkcert)に行くと「ブラウザ警告をもっと減らす」「ワイルドカードで楽する」みたいな方向に進めます🪄✨ (でも第26章の時点で、もう開発はかなり快適になるはず!😆🔒)