web-dev-qa-db-ja.com

デジタル証明書自体を使用して署名できますか?

グーグルいくつかの講義を見て、デジタル証明書を使用して署名することが可能であると述べました。私の知識によれば、署名プロセス中にデジタル証明書が使用される秘密鍵のみを使用して署名することが可能であるため、私はそれについて混乱していますか?

29
juaninf

関係者全員が理解する必要のある不正確な言葉の問題。

あなただけが持っている秘密鍵を使って署名します。公開鍵は使用されず、証明書は使用されません。実際、公開鍵を使用した証明書がない可能性があります。検証者は、公開鍵を使用して署名を検証します。証明書は使用されません。ただし、公開鍵は単なる数値(または2つの数値)です。裸の数字を扱うのは不便です。そのため、公開鍵は、公開鍵の目的を示すメタデータとともに持ち運ばれることがよくあります。それは証明書です。

多分それは単に「juaninfの公開鍵」と言って、自己署名されています(それ自体の公開鍵と一致する秘密鍵を使用して作成された署名が添付されています)。

たぶん職場では、上司が署名したメモ「これはjuaninfの公開鍵です。2019-06-23に彼を雇って私に雇いました。私は会社Cの部門Dのマネージャーです。ここにこの事実を証明する企業CのCEOの署名」。建物の自動ドアでこれをテストできます。そしてあなたの秘密鍵はクローンできないスマートカードに入っています。

ブラウザーのURLの横にあるロックをクリックすると、サイトのTLS証明書が表示されます。証明書では、公開鍵を確認できます。証明書を見ることができるので、証明書があります。しかし、一致する秘密鍵がありません。したがって、証明書に公開鍵の新しい署名を作成することはできません。したがって、サイトの他の訪問者に対してMitM攻撃を行うことはできません。 MitM攻撃を行うには、DHキー交換メッセージに署名する(またはTLSの古い構成で暗号化されたシークレットを復号化する)ために、証明書の公開キーと一致する秘密キーが必要です。

「証明書を持っている」または「証明書と秘密鍵を持っている」と正確に言うことが重要な場合があります。しかし、多くの場合、何が必要かは文脈から明らかです。

49
Z.T.

Z.T.の答えに1つ追加することがあります。混乱は、Microsoft Windowsでの暗号化の実装(おそらく他のシステムも)が原因である可能性があります。

管理UIでは、証明書と対応する秘密鍵の両方が、管理コンソールの「証明書」スナップインを介して管理されます。

.NETフレームワークでは、クラスX509Certificate2は、デジタル証明書を表すために使用され、HasPrivateKeyおよびPrivateKeyのプロパティを持っています。後者のドキュメントには、「秘密キーを表すAsymmetricAlgorithmオブジェクトを取得または設定する関連付けられている証明書」と記載されています。ただし、一般的な慣習では、フィールドはオブジェクトに属するものを表すため、開発者は秘密鍵は証明書に関連するものではなく、証明書の一部であると想定する可能性があります。

最後に、ファイルとしての秘密鍵が単独で処理されることはめったにありませんが、通常、公開鍵と証明書とともに.pfxファイルにパッケージ化されます。これらのファイルは「暗号化コンテナ」などと呼ばれる場合がありますが、それらを開くと、アプリケーションのタイトルは「証明書のインポートウィザード」になり、「証明書」と呼ばれます。

これらすべてにより、開発者は公開鍵と(場合によっては)秘密鍵の両方を含むエンティティとしての証明書の精神的状況を把握できます。明らかに、これは技術的に間違っています:証明書はキーにのみ関連付けられていますが、キーは含まれていません。しかし、私はデジタル暗号化と署名を使用して.NETアプリケーションを数年開発してきたことを認めざるを得ません。今日、「証明書」という用語の理解が間違っていたことを初めて知りました。また、他の開発者とのミーティングで証明書を使用して何かに署名/復号化することについて話したときも、修正されたことはありません。

10
IMil