開発者ツール · SHA ハッシュ計算ツール
証明書と SSH フィンガープリント: SHA-256 が公開鍵を識別する方法
· 背景
しゃ-256 暗号化 セキュリティ
フィンガープリントは証明書またはキーのハッシュであり、声に出して読み上げるのに十分な長さです。この投稿では、TLS および SSH フィンガープリントがどのように計算されるか、SHA-1 フィンガープリントが置き換えられる理由、および一致が何を証明するかについて説明します。
常に受け入れられるホスト キー プロンプト — SHA256: 行が比較を求めているもの
SSH 経由でサーバーに初めて接続すると、ホスト キーを受け入れるかどうかを尋ねるプロンプトが表示されます。プロンプトには、`SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` などのフィンガープリントが表示されます。このフィンガープリントはサーバーの公開キーのハッシュです。このキーを認識していることを帯域外 (SSH プロトコルの外) で検証するように求められます。通常、プロンプトにはキーのタイプ (RSA、ED25519、ECDSA) とフィンガープリントの形式も表示されます。以前に信頼できるチャネルを通じてこのキーのフィンガープリントを見たことがある場合は、自信を持って「yes」と入力できます。そうでない場合、受け入れるとは、ネットワークが正しいキーを配信することを信頼することを意味します。
フィンガープリントは、エンコードされたキーに適用された暗号化ハッシュ関数の出力にすぎません。 SSH の場合、キーはバイナリ BLOB (OpenSSH ワイヤ形式) としてエンコードされ、ハッシュはその BLOB に対して計算されます。指紋はフルキーよりも短いため、読み取りや入力が可能です。同じキーから同じフィンガープリントが常に得られるため、複数の場所またはチャネルで公開されたフィンガープリントを比較できます。
フィンガープリントはエンコーディングのハッシュと等しくなります — 入力としての DER 証明書または公開キー BLOB
SSH ホスト キーと TLS 証明書のエンコード方法は異なりますが、フィンガープリンティングの原則は同じです。 SSH の場合、フィンガープリントは公開鍵マテリアルから計算されます。 TLS 証明書の場合、フィンガープリントは証明書全体 (発行者、有効期限、その他のフィールドを含む) から計算されます。 Web サーバーに接続する場合、ブラウザーは証明書のフィンガープリントを表示しません。これは、TLS が異なる信頼モデルを使用するためです。ブラウザーは、プリインストールされている一連の認証局 (CA) を信頼し、それらの CA が証明書を保証します。 SSH は、プリインストールされた CA を使用しません。代わりに、特定のキーを信頼し、ローカルの `~/.ssh/known_hosts` に保存します。
フィンガープリントには TLS の証明書バイト全体が含まれるため、再署名せずに有効期限を変更すると、異なるフィンガープリントが作成されます。 SSH の場合、フィンガープリントは公開キーのみであるため、キーが変更されない限りフィンガープリントは安定しています。
この計算ツールは、SHA-1 および SHA-256 の長さを示します。フィンガープリント ポリシーの推奨事項にはプロトコル ソースが必要です
従来、SSH フィンガープリントは MD5 16 進数で表示されていました。 MD5 は暗号的に破られており、衝突は現実的です。セキュリティ コミュニティは、デフォルトとして SHA-256 フィンガープリントに移行しました。 SSH クライアントでは引き続き両方の形式 (`SHA256: base64` と `MD5: hex`) が表示される場合があります。 SHA-256 フィンガープリントは、本人確認のために信頼できるものです。両方が表示される場合は、SHA-256 バージョンを、信頼できるソース (サーバーの Web サイト、管理者からの署名付き電子メール、内部 Wiki) からのフィンガープリントと比較してください。 MD5 の衝突が存在するため、MD5 フィンガープリントの信頼性は低くなります。
フィンガープリント形式の変更は、暗号化の移行の目に見える兆候です。古い OpenSSH バージョンでは MD5 のみが表示されていました。最新のバージョンでは、デフォルトで SHA-256 が表示されます。コマンド `ssh-keygen -l -f /path/to/key` は、使用しているバージョンの ssh-keygen のデフォルト形式でキーのフィンガープリントを表示します。 `-E` フラグ (`-E sha256` または `-E md5` など) を使用して特定の形式を強制できます。
SSH の Base64 SHA256: format — フィンガープリントを 16 進数より短くしたエンコーディングの変更
SSH Base64 フィンガープリントはバリアント形式を使用します。アルゴリズム名とコロンがプレフィックスとして付けられます (例: `SHA256:base64string`)。これは、ハイフンを使用し、標準の Base64 のみを含むサブリソース整合性 (SRI) 形式とは異なります。 SSH 形式には、どのアルゴリズムがダイジェストを生成したかを明確にするラベルが含まれています。 SSH 出力でフィンガープリントが表示されると、アルゴリズムが常に表示されます。 SRI 整合性属性が表示される場合、アルゴリズムはハイフンを伴うプレフィックスとしてエンコードされます。
ToolAcre SHA ハッシュ計算ツールからの Base64 出力は標準形式です。 SSH フィンガープリントと一致させるには、`SHA256: ` (アルゴリズム名、コロン、スペース) を先頭に追加します。計算機からの 16 進形式は、SSH が表示する形式ではありませんが、同じダイジェストを表し、検証目的では同様に有効です。
一致によって証明されること — 相手側が公開したのと同じキーバイトを保持しており、アウトオブバンドチェックがなければキーの所有者については何も分からないこと
フィンガープリントの一致は 2 つのことを証明します。1 つ目は、相手側が公開した同じキー バイトを保持していること、2 つ目は、ダイジェストが計算されてからキーもフィンガープリントも変更されていないことです。キーの所有者の身元を証明したり、特定のアクションを許可したりするものではありません。帯域外での指紋の検証は、鍵を信頼するための必要条件ではありますが、十分条件ではありません。また、指紋を公開した人物が本人であることも確認する必要があります。
実際には、管理者がサーバーの SSH フィンガープリントを会社のイントラネットまたは署名付き電子メールで公開すると、それが接続時に受信するプロンプトと一致することを確認できます。フィンガープリントが一致しない場合は、誰かがトラフィックを傍受しているか、サーバー キーが変更されているため、自信を持って接続を拒否できます。指紋が一致すれば、正しいキーを持っていることがわかります。そのキーが適切なサーバーに属しているかどうかは別の質問であり、発行チャネルを確認することで答えられます (イントラネット ページは正当なものに見えますか? 電子メールは実際にその管理者のアカウントから送信されたものですか?)。
実用的な例 — 信頼できるチャネルを通じて公開されたフィンガープリントと照合して段階的に検証する
証明書フィンガープリントも同じ目的を果たし、特定の証明書を一意に識別します。 TLS サーバーが証明書を変更した場合 (更新中など)、新しい証明書には異なるフィンガープリントが付けられます。証明書の固定 (アプリケーション内のフィンガープリントまたは許容可能なフィンガープリントの少数のセットをハードコーディング) は、証明書の変更を検出するためのセキュリティ技術です。サーバーが異なるフィンガープリントを持つ証明書を提示すると、アプリケーションはそれを拒否します。これにより、侵害された CA がブラウザが信頼する不正な証明書を発行することを防ぎます。
証明書の固定には慎重な管理が必要です。サーバーが証明書を更新し、ユーザーがそれを予期していなかった場合、アプリケーションは有効な新しい証明書を拒否します。多くのアプリケーションは代わりに、証明書全体ではなく公開キーを固定する公開キー固定を使用します。これにより、同じキーが使用されている限り、拒否されることなく証明書を更新できます。
有効な例: ToolAcre は DER または SSH ワイヤー バイトではなく、UTF-8 テキストをハッシュペーストしたため、プロトコル対応ツールで検証します。
検証のために指紋を手動で計算するのは簡単です。証明書またはキーをファイルに保存し、`openssl dgst -sha256 filename` または `ssh-keygen -l -f filename -E sha256` を使用してフィンガープリントを表示し、サーバーが表示したフィンガープリントと比較します。 ToolAcre SHA ハッシュ計算ツールは、キー バイトを貼り付けるとダイジェストを計算することもできますが、計算ツールはバイナリ ファイルではなく、貼り付けた UTF-8 テキストをハッシュすることに注意してください。キーが PEM 形式 (`-----BEGIN CERTIFICATE-----` ヘッダーと Base64 でエンコードされたバイトを含むテキスト) の場合は、それを計算機に貼り付けることができます。 DER 形式 (バイナリ) の場合は、コマンドライン ツールを使用するか、最初に PEM に変換する必要があります。
境界は重要です。ToolAcre は、電卓インターフェイスに貼り付けた UTF-8 テキストをハッシュします。デバイスからファイルを読み取ることはありません (すべての計算はブラウザ内、タブ内で行われ、ネットワークは使用されません)。ディスク上にキー ファイルがある場合は、テキスト エディタで開き、テキストをコピーして、PEM 形式の場合は電卓に貼り付けることができます。または、`openssl`、`ssh-keygen`、`sha256sum` などのコマンド ライン ツールを使用して、ローカルでハッシュを計算することもできます。
要点: 帯域外のフィンガープリントを比較する — ToolAcre SHA ハッシュ計算ツールは、フィンガープリントが使用する長さで SHA-1 および SHA-256 ダイジェストがどのようになるかを示します
ToolAcre SHA ハッシュ計算ツールは、テキスト入力の SHA-1 および SHA-256 ダイジェストを表示します。 PEM 形式の証明書または SSH 公開キーを貼り付けると、計算機は両方のダイジェストを計算します。 SSH キーの場合、計算機は貼り付けたテキストをハッシュします。標準の Base64 でエンコードされた SSH 公開キー形式を貼り付ける場合、SSH はハッシュする前に独自の形式 (ワイヤ形式) を適用するため、ダイジェストは SSH フィンガープリントと一致しません。直接一致するには、SSH が内部で使用する正確な形式 (公開表示形式ではない) のキーが必要です。
証明書フィンガープリントの場合、動作は同様です。PEM エンコードされた証明書テキストを貼り付けると、計算機はそのテキストをハッシュします。証明書のフィンガープリントは、PEM テキスト ラッパーではなく、エンコードされた証明書バイト (DER 形式) に基づいて計算されます。バイトは同じですが、テキストのエンコーディングが異なります。 OpenSSL またはブラウザの証明書ビューアからの証明書フィンガープリントと照合するには、人間が判読できない DER バイトを提供する必要があります。電卓の目的は、貼り付けて読み取ることができる UTF-8 テキストをハッシュして、境界を明確にすることです。標準のバイナリまたはワイヤ プロトコル形式の暗号キー ファイルではなく、テキスト入力をハッシュします。