自分で証明書の署名を確認しようとしています。これを行うために、OpenSSLを使用して次の2つのコマンドラインで自己署名証明書を作成しました。
openssl ecparam -name secp256k1 -genkey -param_enc explicit -out private-key.pem
openssl req -new -x509 -key private-key.pem -out server.pem -days 730
私はそれぞれ公開鍵と署名を明確に区別できます:
公開鍵
93 99 FD 9F 7F 04 48 AF 51 2C 6D 2D 69 04 B9 1F 88 A9 C2 64 31 8E 68 70 5B 55 C8 63 C2 C3 AC A4 17 BD 89 1A 5E 8E 08 C4 B7 92 AD AF 51 28 D3 AC BC CE 73 FA 5D D2 FE A7 EB 53 C7 6E 1A 00 84 2C
署名
32 BA FB EB A8 E9 BB 4B 2D 2B 19 12 65 11 EC BB F5 46 5E B5 59 3A 9D 42 F2 62 74 BA A0 E7 73 03 E1 4C CE 67 2B 7D 3B BA 75 E9 8B 95 95 57 E7 17 B7 C1 99 4B 71 96 74 89 67 5F DC B1 0C 71 3B 5F
私の問題は、署名アルゴリズム(-===-)の入力が何であるかが理解できないことです(ECDSA with SHA256)?
署名前のすべてのデータのハッシュ(SHA256)でECC計算を実行して署名を検証しようとしましたTLV(ie03 48 00 30 45 02 20 32 BA FBを除くすべてEB A8 E9 BB 4B 2D 2B 19 12 65 11 EC BB F5 46 5E B5 59 3A 9D 42 F2 62 74 BA A0 E7 73 03 02 21 00 E1 4C CE 67 2B 7D 3B BA 75 E9 8B 95 95 57 E7 17 B7 C1 99 4B 71 96 74 89 67 5F DC B1 0C 71 3B 5F)ですが、この入力では署名が有効ではないようです。
署名は、tbsCertificate
(署名予定)データに対して計算されます。
https://tools.ietf.org/html/rfc5280#section-4.1 :
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
https://tools.ietf.org/html/rfc5280#section-4.1.1. は言う:
SignatureValueフィールドには、ASN.1 DERでエンコードされたtbsCertificateで計算されたデジタル署名が含まれます。 ASN.1 DERでエンコードされたtbsCertificateは、署名関数への入力として使用されます。この署名値はBIT STRINGとしてエンコードされ、署名フィールドに含まれています。このプロセスの詳細は、[RFC3279]、[RFC4055]、および[RFC4491]にリストされているアルゴリズムごとに指定されています。
この署名を生成することにより、CAはtbsCertificateフィールドの情報の有効性を証明します。特に、CAは公開鍵マテリアルと証明書のサブジェクト間のバインディングを認証します。
したがって、問題の簡単なバージョンは、先頭の30 82 03 02
も除外する必要があることです。そして、あなたは最後から十分にトリミングしませんでした。つまり、30 0A 06 ...
部分(署名アルゴリズム識別子)です。
しかし、すでに示したASN/DER構文解析を使用すると、ルートSEQUENCEに3つの子が含まれていることがわかります。署名は最初の子のみに適用されます。