You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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.crt
    
    在输出中找到类似这样的行(关键词是BIT STRING, encapsulates):
    1656:d=1  hl=2 l=  90 prim: BIT STRING, encapsulates {
    
    这里的1656就是签名字段的偏移量(每个人的证书偏移量会不同)。
  • 用偏移量提取签名值:
    openssl asn1parse -in x509.crt -strparse 1656 -out signature.raw
    
    得到的signature.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

火山引擎 最新活动