ファイル(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:検証エラー:サポートされていない証明書の目的
何かご意見をお聞かせください。どうもありがとう。
システムのマンページから明らかなように またはオンライン 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
を指定するかどうか、より具体的な質問がなければ、それを書く時間がありませんたくさん。