使用OpenSSL CMS代码签名时缺失NULL值的问题及解决
OpenSSL CMS代码签名缺失NULL参数,改用SMIME解决
预期ASN.1结构
2 30 13: SEQUENCE { 4 06 9: OBJECT IDENTIFIER '2 16 840 1 101 3 4 2 1' 15 05 0: NULL : }
实际生成的ASN.1结构
2 30 11: SEQUENCE { 4 06 9: OBJECT IDENTIFIER '2 16 840 1 101 3 4 2 1' : }
证书创建步骤
1. 创建自签名根证书
执行命令:
openssl req -new -nodes -utf8 -sha256 -days 3650 -batch -x509 -config cnf.cnf -outform PEM -out rootca.pem -keyout rootca_pri.pem
对应的cnf.cnf配置文件:
[ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = extensions [ req_distinguished_name ] C = xx O = xxxxxx CN = xxxxxx [ extensions ] subjectKeyIdentifier = keyid authorityKeyIdentifier = keyid:always, issuer basicConstraints = CA:TRUE keyUsage = cRLSign, keyCertSign
2. 创建代码CA
执行命令:
openssl genrsa -out codeca_pri.pem 2048 openssl req -new -config codeca.cnf -out codeca.csr -key codeca_pri.pem openssl x509 -req -in codeca.csr -CA rootca.pem -CAkey rootca_pri.pem -CAcreateserial -out codeca.pem -days 365 -extensions extensions -extfile cnf.cnf
对应的codeca.cnf配置文件:
[ req ] default_bits = 2048 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = extensions [ req_distinguished_name ] C = xxx O = xxxxxxxxx CN = xxxxxxxxxxxxxxxxxxxxxx [ extensions ] authorityKeyIdentifier = keyid, issuer subjectKeyIdentifier = keyid extendedKeyUsage =critical, codeSigning basicConstraints =critical, CA:TRUE keyUsage = cRLSign, keyCertSign
3. 创建签名证书
执行命令:
openssl genrsa -out signcert_pri.pem 2048 openssl req -new -config cercnf.cnf -out signcert.csr -key signcert_pri.pem openssl x509 -req -in ./cert/signcert.csr -CA codeca.pem -CAkey codeca_pri.pem -CAcreateserial -out signcert.pem -days 365 -extensions extensions -extfile cnf.cnf
对应的cercnf.cnf配置文件:
[ req ] default_bits = 2048 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = extensions [ req_distinguished_name ] C = xxx ST=xxxxx L=xxxxxxxxxx O = xxxxxxxxxxxx CN = xxxxxxxxxxxxxxxxx [ extensions ] subjectKeyIdentifier = keyid authorityKeyIdentifier = keyid, issuer basicConstraints = CA:FALSE keyUsage = critical, nonRepudiation, digitalSignature extendedKeyUsage = codeSigning
签名命令及问题
使用CMS命令对foo.exe签名:
openssl cms -sign -nosmimecap -signer signcert.pem -inkey signcert_pri.pem -binary -in foo.exe -outform der -out foo.cert.cms -certfile codeca.pem
生成的CMS文件中,OID 2.16.840.1.101.3.4.2.1(SHA-256)后缺失必填的NULL参数。
解决方法
将签名命令从openssl cms替换为openssl smime,即可生成包含NULL参数的正确CMS结构。
内容的提问来源于stack exchange,提问作者Nav Boom
相关产品推荐
相关产品推荐

