如何从含内置密钥的.cer文件执行OpenSSL SMIME签名命令?
使用内置密钥的.cer文件执行OpenSSL SMIME签名的解决方案
原用于字符串签名的OpenSSL命令:
openssl smime -sign -signer cert.crt -inkey key.key -engine gost -binary -noattr
现有一个声称内置密钥的.cer文件,以下是针对你提出的两种方案的具体实现:
方案1:修改命令直接使用文件内置密钥
首先明确:标准X.509格式的.cer证书仅包含公钥,不可能内置私钥。如果该文件实际是PKCS#12格式(常以.pfx/.p12为扩展名,包含证书+私钥)但被错误命名为.cer,可直接用以下命令签名:
openssl smime -sign -signer cert.cer -inkey cert.cer -engine gost -binary -noattr -passin pass:你的文件密码
- 若OpenSSL无法识别文件格式,可添加
-certform P12参数强制指定为PKCS#12格式 - PKCS#12文件默认有密码保护,必须用
-passin指定解锁密码
方案2:转换格式并提取私钥(复用原命令)
如果要拆分出.crt证书和.key私钥文件,执行以下步骤:
- 提取证书(生成.crt文件):
openssl pkcs12 -in cert.cer -nokeys -out cert.crt -passin pass:你的文件密码
- 提取私钥(生成.key文件):
# 生成带密码保护的私钥 openssl pkcs12 -in cert.cer -nocerts -out key.key -passin pass:你的文件密码 -passout pass:私钥保护密码 # 生成无密码的私钥(无需输入密码即可使用) openssl pkcs12 -in cert.cer -nocerts -out key.key -passin pass:你的文件密码 -nodes
拆分完成后,即可直接使用你原来的签名命令。
关于你提供的.cer文件内容说明
你通过openssl x509 -in cert.cer -noout -text查看的输出显示这是一个X.509证书,但出现Unable to load Public Key错误,原因是OpenSSL的GOST引擎未正确配置,不支持证书使用的GOST R 34.10-2012算法。需先确保GOST引擎正常加载:
openssl engine gost
若命令无法输出GOST引擎信息,需重新安装或配置支持GOST算法的OpenSSL版本。
再次强调:标准X.509证书(.cer/.crt)不可能包含私钥,若该文件确为纯证书,你必须找到对应的私钥文件才能完成签名。
内容的提问来源于stack exchange,提问作者Nick Farsi
相关产品推荐
相关产品推荐

