証明書の署名はASN.1形式にエンコードされていますか?
私は、ここでの私の質問に対する回答と他のいくつかの調査の助けを借りて、デジタル証明書を発行するプロセスを説明する図に取り組んでいます。
私はIETFで次のことを読みました:
SignatureValueフィールドには、ASN.1DERでエンコードされたtbsCertificateで計算されたデジタル署名が含まれています。ASN.1 DERでエンコードされたtbsCertificateは、署名関数への入力として使用されます。この署名値はビット文字列としてエンコードされ、署名フィールドに含まれます。
CSRステップから「署名> ASN.1形式へのエンコード> base64へのエンコード」のプロセスにある程度精通しているため、ここでは見た目が異なります。したがって、この順序ではなく、「ASN.1形式へのエンコード>署名」になります。 > base64へのエンコード??」
しかし、それは私には意味がありません。Base64にエンコードする前に、証明書の3つの主要なフィールド(tbsCertificate、signatureAlgorithm、signatureValue)をASN.1形式にエンコードするべきではありませんか?それで、ASN.1は証明書を発行する際にCAによって2回使用されますか?
したがって、これは正しいフローです。 https://i.stack.imgur.com/bJd0o.png ?
- また、デジタル証明書の発行プロセスを説明する図がどれほど正確か知りたいのですが。
回答
TLDR:はい、CSRまたは証明書のすべてがASN.1表記を使用しています。ASN.1はデータ型の説明です。
ここで解凍するものがいくつかありますが、いくつかの定義から始めましょう。
PKIで使用されるデータ形式:
ASN.1:
これは構文表記、またはさまざまなデータ型(整数、文字列、バイトなど)を表す方法です。同等のプログラミング言語は、定義された型を持つデータ構造です。例えば:
struct Certificate {
tbsCertificate TBSCertificateType // Another struct
signatureAlgorithm SignatureAlgorithmType // Another struct
signatureValue []byte // An array of bytes
}
DER:
DERエンコーディングは、ASN.1データをシリアル化する方法です。出力は、ファイルに保存したり、ネットワーク経由で送信したり、署名アルゴリズムへの入力として使用したりできるバイトの配列です。
PEM:
PEMは、DERデータとヘッダーおよびフッターのbase64表現です。これにより、ASCIIのみのチャネルを介して簡単に送信できるASCIIデータが生成されます(例:電子メールはバイナリを実行しないため、エンコードする必要があります)。
ここでは厳密に必要ではないため、PEMエンコーディングは無視します。これは、パーティ間で受け渡すバイナリデータをカプセル化するためにのみ使用されます。
署名の仕組み:
PKIの署名アルゴリズムには3つのパラメータがあります
- 署名アルゴリズム(およびオプションのパラメーター)、例:
PKCS #1 SHA-256 With RSA Encryption - キー:署名者の秘密キー
- 入力:署名する生のバイト
出力が1つあります。それは、ビット文字列である署名です。
注:ASN.1では、オクテット文字列とビット文字列は2つの異なるタイプです。これらは両方ともバイナリデータですが、ビット文字列は任意の長さにすることができますが、ビット単位のオクテット文字列の長さは8の倍数である必要があります。
入力への署名:
入力が何であっても(CSRの場合はcertificationRequestInfo、証明書の場合はtbsCertificate)、最初にプレーンバイナリにエンコードする必要があります。
そのバイナリが何であるかについての標準が必要です。幸いなことに、1つあります。
- CSRの場合、RFC2986は次のように述べています。
The value of the certificationRequestInfo component is DER encoded, yielding an octet string - 証明書の場合、RFC5280は次のように述べています。
The signatureValue field contains a digital signature computed upon the ASN.1 DER encoded tbsCertificate.
どちらの場合も、ASN.1形式の関連データはDERエンコードしてから、署名アルゴリズムに入力する必要があります。出力(署名)はビット文字列です。
出力はどうなりますか:
署名アルゴリズムの出力は、signatureValueタイプがの証明書のofフィールドに格納されbit stringます。繰り返しますが、これはASN.1表記です。
すべての証明書フィールドが適切に設定されると、証明書はDERエンコードされます。
必要に応じて、DERデータはbase64でエンコードされ、PEMデータ形式になります。ただし、これは必須ではありません。
警告の言葉:
あなたはやりすぎだと思います。CSR /証明書フローの基本コンポーネントから始めて、後で詳細(データエンコーディングなど)について心配します。
考えられるすべての詳細を含む図の代わりに、高レベルから始めて、プロセスを適切に処理し、必要に応じて詳細を掘り下げます。