コンテンツにスキップ

TLS で調整できること

Pingclair の TLS の表面は意図的に小さくできています。名前は自動で証明書を取得し、 その仕組みを決める設定がここに書かれているものです。Caddy が受け付けるそれ以外は 黙って無視されず名前を挙げて拒否されるので、設定が名目より静かに劣ることは ありません。このページは、実機で測った「実際に効くもの」と「効かないもの」を 集めたものです。

  • Pingclair が導入され動いていること(インストール)。
  • 認証局に関わる部分では、ホストに解決する名前、または実験機向けの内部認証局 (HTTPS)。

🌐 どのプロトコルを配信するか

Section titled “🌐 どのプロトコルを配信するか”

プロトコルの集合はグローバルの servers ブロックに置きます。

{
servers {
protocols h1 h2 h3
}
}

sudo ss -lun | grep ':443 ' による実測:

設定 UDP 443 リスナー
protocols h1 h2 0 — HTTP/3 なし
protocols h1 h2 h3 1 — HTTP/3 有効

⚠️ このリストが決めるのは HTTP/3 だけで、それ以外ではありません。h1 だけを 並べても HTTP/2 は外れません。protocols h1 でも、ALPN で h2 を提示した クライアントは HTTP/2 を交渉しました。コンパイラはこのリストを HTTP/3 の スイッチに写しているだけです(config.global.http3 = protocols.contains(H3))。 名前ごとに HTTP/2 を無効にする設定はありません。

サイト単位では http3 off が、QUIC リスナーを止めずにその名前を HTTP/3 から 外します。

https://internal.test {
tls {
internal
http3 off
}
file_server /srv/site
}

三つあり、いずれも HTTPS のページ に書いてあります。

入手元 設定 用途
Let’s Encrypt 素の公開名 公開名。バックグラウンドで更新。
内部認証局 tls internal 実験用の名前、私有オリジン、トンネル。
自分のファイル tls { cert … key … } 他所で発行した証明書。

更新は自動で走ります。グローバルオプションの renewal_window_ratio は、各証明書の 寿命のうちどれだけ早く更新を始めるかを割合で決めます。

client_auth はクライアントの証明書を要求します。openssl で小さな認証局と クライアント証明書を作り、サイトを認証局のファイルに向けます。

https://internal.test {
tls {
internal
client_auth {
mode require_and_verify
trusted_ca_cert_file /etc/pingclair/client-ca.crt
}
}
file_server /srv/site
}

実測: クライアント証明書なしの要求はハンドシェイクで失敗し、 --cert client.crt --key client.key を付けた同じ要求は 200 を返します。

モードは requestrequireverify_if_givenrequire_and_verify で、代替は ありません。綴りを間違えると (expected request, require, verify_if_given or require_and_verify) と一覧付きで 拒否されます。

⚠️ trusted_ca_cert は証明書をインラインで受け取り、trusted_ca_cert_file は パスを受け取ります。前者にパスを渡すとコンパイルは通り、起動時に trusted_ca_cert is not a certificate: not valid base64: Invalid symbol 45 で 失敗します(-----BEGIN-)。ファイルは pingclair ユーザーから読める必要も あります。

ストアには発行済み証明書、ACME アカウント、内部認証局が入っており、 その場所は /var/lib/pingclair/.local/share/pingclair——サービスアカウントのデータ ディレクトリです。別のユーザーで走らせるときに PINGCLAIR_TLS_STORE が それを名指しします(下の例が接頭辞を付けているのはそのためで、root の既定は /root/.local/share/pingclair です)。storage-exportstorage-import がそれを移します。

ターミナルウィンドウ
sudo PINGCLAIR_TLS_STORE=/var/lib/pingclair/.local/share/pingclair pingclair storage-export -o /tmp/store.tar
sudo systemctl stop pingclair
sudo rm -rf /var/lib/pingclair/.local/share/pingclair
sudo mkdir -p /var/lib/pingclair/.local/share/pingclair && sudo chown pingclair:pingclair /var/lib/pingclair/.local/share/pingclair
sudo PINGCLAIR_TLS_STORE=/var/lib/pingclair/.local/share/pingclair pingclair storage-import -i /tmp/store.tar
sudo systemctl start pingclair
✅ Store exported to /tmp/store.tar
✅ Store imported into /var/lib/pingclair/.local/share/pingclair

実行から三つの点。アーカイブは名前に関わらずただの tar で、モード 600 で 書かれるため読み戻すには root が必要です。インポートはアーカイブに記録された所有権を そのまま復元します。そしてストアには autosave.json(Admin API が最後に適用した 設定)も含まれるので、それも一緒に戻ります。

その後サービスが Internal CA I/O error: Permission denied で起動を拒むなら、 ストアのファイルがサービスアカウントから書けません。 sudo chown -R pingclair:pingclair /var/lib/pingclair/.local/share/pingclair で直り、サイトは再び 応答します。

以下は Pingclair が認識して拒否する Caddy の設定です。設定が黙って落とされたまま 実行されることはありません。

Caddy-compatible directive 'tls ciphers' is not supported by Pingclair yet: Pingclair does not implement this TLS option yet
Caddy-compatible directive 'tls curves' is not supported by Pingclair yet: Pingclair does not implement this TLS option yet
Caddy-compatible directive 'tls alpn' is not supported by Pingclair yet: Pingclair does not implement this TLS option yet
Caddy-compatible directive 'tls on_demand' is not supported by Pingclair yet: Pingclair does not implement this TLS option yet

つまり暗号スイート、曲線、ALPN の一覧、オンデマンド発行は設定ではなくビルドの 選択です。OCSP ステープリングと preferred_chains も実装されていません。どれかが 必要なら、設定ミスではなく機能要望です。

  • client_authnot valid base64 で起動を拒む。 trusted_ca_cert に パスを渡しています。ファイル用の綴りは trusted_ca_cert_file です。
  • 有効な証明書を持つクライアントが拒否される。 署名した認証局が trusted_ca_cert_file のものか、証明書が期限切れでないかを確認します。
  • tls ciphers / tls curves / tls alpn / tls on_demand がファイルを 拒否する。 実装されていません。上の節を参照してください。
  • protocols h1 h2 でも HTTP/3 が動き続ける。 本来は止まります。それを決める のがこのリストです。UDP 443 がまだ待ち受けているなら、動いているファイルは 編集したファイルではありません (再読み込みの意味)。
  • ストアを移したあとサービスが起動しない。 上記の所有権の問題です。
  • HTTPS: 証明書を得る四つの方法と、その正確なログ行。
  • HTTP/3: 有効にして、クライアントが使ったことを示す方法。
  • tls: ディレクティブのリファレンス。