You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:17:44