我发出了以下命令来为文件(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格式:
[ 加州 ]
default_ca = ca_default
[ ca_default ]
证书 = ca.crt
私钥 = ca.key
序列号 = ca.srl
数据库 = ca.idx
new_certs_dir = /home/apoorv/projects/signed
default_md = 默认
政策 = policy_anything
保留 = 是
默认天数 = 90
unique_subject = 否
[ 政策任何内容 ]
countryName = 可选
stateOrProvinceName = 可选
localityName = 可选
organizationName = 可选
组织单位名称 = 可选
commonName = 可选
emailAddress = 可选
[ 叉 ]
基本约束 = 关键,CA:true
keyUsage = 关键,cRLSign,keyCertSign
[ 共同设计 ]
密钥用法 = 数字签名
扩展密钥使用情况 = 代码签名
命令: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
从你系统的手册页中应该可以清楚地看到或在线假设您的 ca.cnf 中指定的 CA 证书是 ca.crt 并且是根证书,那么您想要的基本功能是
openssl cms -verify -binary -content vmlinuz -inform der -in vmlinuz.sig -CAfile ca.crt
除了默认情况下它需要 ExtendedKeyUsage(如果存在)包括“emailProtection”id-pkix 3 4 而不是(单独)codeSigning;来覆盖该添加-purpose any
。
如果证书层次结构更复杂(即如果它使用链),那么就会出现多种情况,具体取决于您在签名文件中包含哪些证书、-certfile
默认或指定的信任文件和/或目录中有哪些证书以及是否-certfile
使用以及您是否在 1.0.2 中指定-partial_chain
,如果没有更具体的问题,我没有时间写那么多。