キャプチャ時のデータの流れ
ProofSnap API またはダッシュボードで行うキャプチャは、次の5段階で処理されます。
- お客様が HTTPS で URL を送信します。送信元は API(API キーを使用)またはダッシュボードです。
- フランクフルトにある ProofSnap のサーバー上のブラウザがページを読み込みます。接続先は公開アドレスに限られます。本番のキャプチャで URL が Internet Archive に送られるのは、お客様がこの機能を有効にした場合だけです。
- ファイルごとに SHA-256 ハッシュを計算し、マニフェストに署名します。OpenTimestamps のカレンダーと、適格タイムスタンプをご依頼の場合は Disig a.s. に送られるのは、マニフェストのハッシュだけです。
- 封印したパッケージを暗号化してフランクフルトに保管します。本番パッケージのコピーはアイルランドにも保管します。
- パッケージの準備ができたらダウンロードするか、署名付きの Webhook で通知を受け取ります。
データの保管場所
- API
- Amazon Web Services の EU リージョン、フランクフルト(eu-central-1)。
- アカウントとキャプチャのデータ
- Google Cloud Firestore の EU リージョン、フランクフルト(europe-west3)。
- ログイン
- Firebase Authentication(Google のグローバルサービス)。
- 証拠パッケージ
- Amazon S3 の EU リージョン、フランクフルト(eu-central-1)。本番パッケージのコピーをアイルランド(eu-west-1)にも保管します。
EU 域外で処理されるデータ
証拠パッケージとキャプチャのデータは、フランクフルトとアイルランドにとどまります。EU 域外のサービスが処理する可能性があるのは、次のデータだけです。
- キャプチャの URL:本番のキャプチャで、お客様が有効にした場合に限り Internet Archive へ送信されます(初期設定は無効です)。
- マニフェストのハッシュ:OpenTimestamps の公開カレンダーへ送信されます。ファイルの内容は送信されません。
- キャプチャしたサイトのホスト名:Google Public DNS と Cloudflare DNS で名前解決し、公開の RDAP と WHOIS サービスで照会します。
- Firebase Authentication のログイン情報と、Stripe の決済情報。
サーバー側でのキャプチャ
ページの読み込みとキャプチャは、お客様のパソコンではなく ProofSnap のサーバーで行われます。お客様は URL を送信し、封印された証拠パッケージを受け取ります。キャプチャを行うブラウザの接続先は公開アドレスに限られ、プライベートアドレス、ループバックアドレス、クラウドのメタデータサービスのアドレスは、リダイレクト後であっても拒否されます。
独立した公開コピーを残すために URL を Internet Archive(web.archive.org)へ送信する機能は、初期設定では無効です。本番のキャプチャでは、ダッシュボードの「独立アーカイブ(Wayback)」をオンにするか、キャプチャのパラメータexternal_archiveをtrueにすると有効になります。ログイン、パスワード再設定、共有のリンクなど非公開に見える URL や、トークンを含む URL は送信されません。機能を有効にすると、クエリ文字列付きの URL も送信されます。アーカイブの結果はパッケージに記録されます。
パッケージの封印方法
- ハッシュ
- パッケージ内の証拠ファイルごとに SHA-256 ハッシュを計算し、
manifest.jsonに記録します。 - 署名
manifest.jsonには、そのパッケージ専用に生成した RSA-4096 鍵で署名します。署名後に秘密鍵は破棄し、公開鍵をパッケージに同梱します。- Bitcoin ブロックチェーンのタイムスタンプ
- マニフェストのハッシュを OpenTimestamps のカレンダーへ送信し、Bitcoin ブロックチェーンへのアンカーを依頼します。アンカーが確認されると、完全な証明をパッケージとともに保管します。証明を追加できなかった場合は、その旨をパッケージに記録します。
- 適格タイムスタンプ
- ご依頼に応じて(本番 API キーのみ、タイムスタンプごとに課金)、ProofSnap は EU トラステッドリストに掲載された適格トラストサービスプロバイダーである Disig a.s. から eIDAS 適格タイムスタンプ(RFC 3161)を取得します。追加できなかった場合は、その旨をパッケージに記録します。
- オフライン検証
- 各パッケージには検証スクリプト(macOS と Linux 用の
verify.sh、Windows 用のverify.ps1)が含まれ、ProofSnap に依存せずオフラインで検証できます。
発行台帳
ProofSnap は、発行したマニフェストのハッシュを発行台帳に記録します。ハッシュはGET /v1/ledger/{hash}で誰でも照会でき、台帳に見つかれば、ProofSnap がそのパッケージを発行したことを確認できます。エンドポイントの詳細はAPI ドキュメントをご覧ください。
EU 内の別リージョンへのコピー
本番の証拠パッケージは、EU 内の別リージョン(アイルランド)にある別の Amazon S3 バケットへコピーされます。コピーはパッケージの作成から数分以内に行われ、その状態はキャプチャごとにGET /v1/captures/{id}で確認できます。コピーは元のパッケージとともに削除されます。テストモードのパッケージはコピーされません。
保存期間
証拠はキャプチャの日から10年間保存されます。スケジュールでキャプチャするページの場合は、キャプチャした版がまだ最新であると最後に確認された時点から数えます。
- 確認でページに変更がなければ、現在のキャプチャの保存期間が延びます。
- 新しい版に置き換えられたキャプチャは、置き換えられた時点から数えます。
サブスクリプションの終了後は、30日以内にすべてのデータをダウンロードできます。Archive only プランなら、キャプチャをやめた後も証拠の閲覧、ダウンロード、検証を続けられます。
削除
ダッシュボードまたは API で削除したパッケージは、まずゴミ箱に移動し、30日以内なら復元できます。その後、保存されているすべてのバージョンを両方のコピーから削除します。完全な削除を選ぶと、すぐに削除されます。保存期間またはアカウントの30日間のダウンロード期間が終わった場合も、同じ方法ですべてのバージョンを削除します。リーガルホールド中のキャプチャは、ホールドが有効な間は削除できません。誰がいつ削除したかの記録は残りますが、パッケージの内容は残りません。
キャプチャへのアクセス管理
- API キー
- キーの全文は SHA-256 ハッシュとしてのみ保存され、作成時に1回だけ表示されます。失効させたキーは60秒以内に使えなくなります。Website Archive プランの API キーは読み取り専用で、キャプチャの一覧表示、ダウンロード、検証と、Webhook サブスクリプションの管理ができます。このプランのキャプチャとスケジュールはダッシュボードで作成します。
- ダッシュボードへのログイン
- Firebase Authentication を使用します。キーの作成、キャプチャの実行、プランの購入の前に、メールアドレスの確認が必要です。
- アクセス履歴
- 会社アカウントのオーナーや案件のメンバーなど、作成者以外の人がキャプチャをダウンロードまたは検証するなどしてアクセスすると、その事実がキャプチャの履歴に記録されます。
- レート制限
- キャプチャ、ハッシュ証明などの課金対象のリクエストには、アカウント単位のレート制限が適用され、そのアカウントのすべてのキーで共有されます。
保存時と通信時の暗号化
- 通信時
- API、ダッシュボード、Webhook の通信はすべて HTTPS(TLS)で行われます。
- 保存時
- 証拠パッケージは両方のバケットで AES-256 により暗号化されます(Amazon S3 のサーバー側暗号化)。両方のバケットで、パブリックアクセスはすべてブロックされています。
Webhook
- 署名
- Webhook の配信には、Standard Webhooks の仕様に沿って HMAC-SHA256 で署名します。リクエストまたはスケジュールで指定した
webhook_urlへの配信には、その URL を設定した API キーに紐づく Webhook 署名シークレットを使います。このシークレットは、24時間の移行期間を設けて変更できます。アカウント単位の Webhook サブスクリプションには専用の署名シークレットがあり、作成時に1回だけ表示されます。 - 配信先
- Webhook の配信先は公開の HTTPS エンドポイントに限られます。配信のたびにホスト名を解決し直して確認し、確認した IP アドレスにだけ接続するため、DNS レコードが変更された後でも、プライベートアドレス、ループバックアドレス、クラウドのメタデータサービスのアドレスは拒否されます。リダイレクトには従いません。
- 再試行
- 配信がタイムアウト、接続エラー、または2xx 以外のレスポンス(410 Gone を除く)で失敗すると、約35時間のうちに最大5回(5分後、30分後、2時間後、8時間後、24時間後)再試行します。受信側が重複を除外できるよう、
webhook-idは同じ値を使います。各回の応答待ちの上限は10秒です。 - ダウンロード
- 再試行の配信と Webhook サブスクリプションの配信には、24時間有効なダウンロードリンクは含まれません。受信側は
GET /v1/captures/{id}で新しいリンクを取得できます。 - Webhook サブスクリプション
- アカウント単位の Webhook サブスクリプションは、エンドポイントが410 Gone を返したとき、配信が1件も成功しないまま5日が過ぎたとき、または API キーで作成した場合はそのキーが失効したときに無効になります。イベントは30日間保存され、
GET /v1/eventsで取得できます。
外部サービス
- 決済
- 決済は Stripe が処理します。ProofSnap はカード番号を保存しません。
- アカウント関連のメール
- メールアドレスの確認とパスワード再設定のメールは、MailerSend が送信します。
- タイムスタンプ
- OpenTimestamps のカレンダーと、適格タイムスタンプの場合の Disig a.s. が受け取るのはマニフェストのハッシュだけで、証拠そのものは受け取りません。
- DNS と WHOIS の照会
- キャプチャしたサイトを記録するため、ホスト名を Google Public DNS と Cloudflare DNS で解決し、ドメインの登録情報を公開の RDAP と WHOIS サービスで照会します。
脆弱性の報告
セキュリティ上の脆弱性を見つけた場合は、内容と再現手順を添えてsupport@getproofsnap.comまでお知らせください。