GetHTTPSは、サーバーサイドコンポーネントを一切使わずに、Let’s Encryptから無料のHTTPS証明書を発行するブラウザベースのACMEクライアントです。
アーキテクチャ
certbotやacme.shなどの従来のACMEクライアントは、サーバー上で動作します。シェルアクセス、root権限、そして多くの場合、証明書を更新するためのcronジョブが必要です。
GetHTTPSは異なるアプローチを取ります:すべてがブラウザタブ内で実行されます。秘密鍵はWeb Crypto APIでローカルに生成され、ページから離れることはありません。
フローの仕組み
-
アカウントキーの生成 —
crypto.subtle.generateKey()を使用して、ブラウザ内でP-256 ECDSAキーペアが作成されます。この鍵がACMEアカウントを識別します。 -
アカウント登録 — 公開鍵がLet’s EncryptのACME APIに登録されます。各リクエストはJWS(JSON Web Signature)で署名されます。
-
オーダーの作成 — 証明書でカバーするホスト名を指定します。Let’s Encryptがチャレンジ(検証)のセットを返します。
-
チャレンジの完了 — 各ホスト名に対して、HTTP-01チャレンジ(サーバーにファイルを配置)またはDNS-01チャレンジ(TXTレコードを追加)のいずれかを完了します。
-
事前チェック検証 — Let’s Encryptに送信する前に、GetHTTPSは公開インターネットからチャレンジの設定をチェックします。これにより、レート制限を消費する前にタイプミスを検出できます。
-
証明書の発行 — チャレンジに合格すると、別の証明書キーペアが生成され、CSR(証明書署名要求)が構築され、オーダーが確定されます。Let’s Encryptが署名済みの証明書チェーンを返します。
-
ダウンロード —
privkey.pem、cert.pem、chain.pem、fullchain.pemをダウンロードして、サーバーにデプロイします。
セキュリティモデル
GetHTTPSは、私たちでさえあなたの秘密鍵にアクセスできないように設計されています。
秘密鍵はブラウザから離れません
すべての鍵(アカウントキーと証明書キー)は、ブラウザのWeb Crypto API(crypto.subtle.generateKey())を使用して生成されます。鍵素材はタブ内のJavaScriptメモリにのみ存在します。ディスクに書き込まれることはなく、ネットワーク経由で送信されることもなく、gethttps.comからアクセスすることもできません。
「ダウンロード」をクリックすると、PEMファイルはクライアント側で URL.createObjectURL() を使用して作成され、ダウンロードとして提供されます。ファイルはメモリからファイルシステムに直接渡されます。私たちのサーバーに触れることはありません。
バックエンドなし、プロキシなし
従来の証明書ツールはサーバーサイドプロセスを実行します。つまり、秘密鍵はあなたが制御できないサーバー上に存在する可能性があります。
GetHTTPSにはバックエンドがありません。サイトは静的なHTML、CSS、JavaScriptです。ブラウザがACMEリクエストを acme-v02.api.letsencrypt.org に直接送信します。これらのリクエストをプロキシ、検査、またはログに記録することはありません。
私たちが見えるものと見えないもの
| 見える | 見えない | |
|---|---|---|
| あなたの秘密鍵 | ✗ | ✓(ブラウザのみ) |
| あなたのドメイン | ✗ | ✓(Let’s Encryptに直接送信) |
| ACMEリクエスト | ✗ | ✓(ブラウザ → Let’s Encrypt) |
| チャレンジトークン | ✗ | ✓(ブラウザ内で生成) |
| あなたのメールアドレス | ✗ | ✓(Let’s Encryptにのみ送信) |
DNS事前チェック
チャレンジ検証のために、GetHTTPSはパブリックDNSリゾルバー(GoogleのDNS-over-HTTPS API経由)にクエリを送信します。これらのクエリにはドメイン名と予想されるTXTレコードのみが含まれます。プライベートデータは含まれません。
脅威モデル
保護対象:
- サーバー侵害による鍵の窃取(侵害すべきサーバーがない)
- 鍵素材への中間者攻撃(鍵はタブから離れない)
- データ収集(デフォルトでは分析なし、バックエンドログなし)
保護対象外:
- 侵害されたブラウザ(ブラウザが侵害された場合、すべてが危険にさらされます)
- 侵害されたDNSプロバイダー(攻撃者があなたのDNSを制御している場合、DNS-01で証明書を発行できます)
- ページメモリを読み取れるブラウザ拡張機能
更新について
Let’s Encryptの証明書は90日間有効です。更新するには、同じフローを再度実行してください。アカウントキー(保存済みの場合)が認識されるため、再登録の必要はありません。
自動更新が必要な場合は、certbotなどのサーバーサイドクライアントをご検討ください。GetHTTPSは、完全な制御と透明性が必要な手動での一回限りの発行用に設計されています。