如何用DSA公钥验证X509证书签名?OpenSSL使用求助
如何用外部DSA公钥验证X509证书的签名
OpenSSL的verify命令确实不直接支持用独立的外部公钥验证证书签名——它的核心逻辑是基于信任链来验证证书的合法性,而不是单独验证签名与某个公钥的匹配性。不过我们可以通过手动提取证书的待签名部分(TBS Certificate)和签名值,再结合openssl dgst命令来完成验证,具体步骤如下:
1. 准备DSA公钥(确保是PEM格式)
如果你的dsa_pub.key已经是PEM格式,可以跳过这一步。如果是DER格式,先转换为PEM:
openssl dsa -in dsa_pub.key -pubin -outform pem > dsa_pub.pem
2. 提取证书的待签名部分(TBS Certificate)
X509证书的签名是对其内部的TBS(To Be Signed)结构做的,我们需要把这部分提取出来:
openssl x509 -in x509.crt -outform der | openssl asn1parse -strparse 4 -out tbs.der
这里的-strparse 4是跳过X509证书最外层SEQUENCE的标签和长度(共4字节),直接提取内部的TBS结构。
3. 提取证书的签名值
证书的签名值存储在BIT STRING字段中,需要准确提取:
- 先运行以下命令找到签名字段的偏移量:
在输出中找到类似这样的行(关键词是openssl asn1parse -in x509.crtBIT STRING, encapsulates):
这里的1656:d=1 hl=2 l= 90 prim: BIT STRING, encapsulates {1656就是签名字段的偏移量(每个人的证书偏移量会不同)。 - 用偏移量提取签名值:
得到的openssl asn1parse -in x509.crt -strparse 1656 -out signature.rawsignature.raw就是包含DSA签名(r和s值的ASN.1 SEQUENCE)的DER数据。
4. 执行签名验证
根据证书使用的哈希算法选择对应的命令:
- 如果证书用的是DSA-SHA1(最常见的旧版本组合):
openssl dgst -dss1 -verify dsa_pub.pem -signature signature.raw tbs.der - 如果证书用的是DSA-SHA256/224/384/512:
比如SHA256的情况:
替换openssl dgst -sha256 -verify dsa_pub.pem -signature signature.raw tbs.der-sha256为对应的哈希算法即可。
如果验证通过,命令会输出Verified OK;如果不匹配,会输出Verification Failure。
额外技巧:快速确认证书的签名算法
可以用以下命令查看证书使用的签名算法:
openssl x509 -in x509.crt -text -noout | grep "Signature Algorithm"
输出类似Signature Algorithm: dsaWithSHA256,这样你就知道该用哪个哈希参数了。
内容的提问来源于stack exchange,提问作者DaveMac001




