web-dev-qa-db-ja.com

.sigファイルが正しいかどうかを確認する方法は?

ファイル(Linuxカーネル)の署名を作成するために、次のコマンドを発行しました。

openssl req -newkey rsa -keyout codesign.key -out codesign.req
openssl ca -config ca.cnf -extensions codesigning -in codesign.req -out codesign.crt

openssl cms -sign -binary -noattr -in vmlinuz -signer codesign.crt -inkey codesign.key -certfile ca.crt -outform DER -out vmlinuz.sig

ca.cnfファイルは私自身のプライベートCAインフラストラクチャ用であり、digitalSignatureキー使用拡張とcodeSigning拡張キー使用拡張が有効になっています。

Ca.cnf形式:

[ca]

default_ca = ca_default

[ca_default]

証明書= ca.crt

private_key = ca.key

シリアル= ca.srl

データベース= ca.idx

new_certs_dir =/home/apoorv/projects/signed

default_md =デフォルト

policy = policy_anything

保存=はい

default_days = 90

unique_subject =いいえ

[policy_anything]

countryName =オプション

stateOrProvinceName =オプション

localityName =オプション

organizationName =オプション

organizationUnitName =オプション

commonName =オプション

emailAddress =オプション

[クロス]

basicConstraints =クリティカル、CA:true

keyUsage = critical、cRLSign、keyCertSign

[コード署名]

keyUsage = digitalSignature

extendedKeyUsage = codeSigning

コマンド:openssl cms -verify -binary -content vmlinuz -inform DER -in vmlinuz.sig -CAfile ca.crt

出力:

検証の失敗140187569694352:エラー:2E099064:CMSルーチン:CMS_SIGNERINFO_VERIFY_CERT:証明書の検証エラー:cms_smime.c:287:検証エラー:サポートされていない証明書の目的

何かご意見をお聞かせください。どうもありがとう。

1
entropy

システムのマンページから明らかなように またはオンライン ca.cnfで指定されたCA証明書がca.crtであり、ルート証明書であると仮定すると、必要な基本機能は次のようになります。

openssl cms -verify -binary -content vmlinuz -inform der -in vmlinuz.sig -CAfile ca.crt 

デフォルトでは、存在する場合に「emailProtection」が含まれている場合はExtendedKeyUsageが必要です。id-pkix34(唯一の)codeSigningではありません。それを上書きするには、-purpose anyを追加します。

証明書階層がより複雑な場合(つまり、チェーンを使用している場合)、-certfileを使用して署名ファイルに含めた証明書、証明書に応じてさまざまなケースがあります。デフォルトまたは指定されたtrustoreファイルおよび/またはディレクトリ、および使用されている場合は-certfileで、1.0.2以降で-partial_chainを指定するかどうか、より具体的な質問がなければ、それを書く時間がありませんたくさん。

1