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

使用OpenSSL验证Azure Key Vault生成的EC签名失败问题排查

问题解决:C#可验证EC签名但OpenSSL失败

核心原因:EC签名格式不匹配或命令参数问题

ECDSA签名有两种主流格式:

  • IEEE P1363:直接拼接r和s的字节数组(无结构化封装)
  • RFC 3279 DER序列:ASN.1编码的结构化格式(SEQUENCE { r INTEGER, s INTEGER })

C#的ECDsa.VerifyHash原生支持两种格式,但OpenSSL的dgst -verify默认只识别DER格式的签名。如果你的签名是IEEE P1363格式,直接用OpenSSL验证就会失败。


具体排查与解决步骤

1. 确认签名格式并按需转换

步骤1:判断签名格式

用OpenSSL尝试解析签名的DER文件:

openssl asn1parse -in sig.der -inform DER
  • 如果能正常输出包含两个INTEGER字段的结构,说明是DER格式,跳过转换步骤;
  • 如果解析报错,说明是IEEE P1363格式,需要转换为DER格式。

步骤2:转换P1363格式到DER格式

用Python快速转换(假设是256位曲线,r和s各占32字节):

import base64
from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature

# 读取清理后的Base64签名
with open("sig_clean.txt", "r") as f:
    sig_b64 = f.read().strip()
sig_bytes = base64.b64decode(sig_b64)

# 按大端字节序拆分r和s
r = int.from_bytes(sig_bytes[:32], byteorder='big')
s = int.from_bytes(sig_bytes[32:], byteorder='big')

# 生成DER格式签名
der_sig = encode_dss_signature(r, s)

# 保存转换后的签名
with open("sig_der.der", "wb") as f:
    f.write(der_sig)

2. 清理签名文件的冗余内容

确保sig.txt是纯Base64编码,无多余换行、空格或特殊字符:

# 移除换行和回车符
tr -d '\n\r' < sig.txt > sig_clean.txt
# 解码为DER格式文件
openssl base64 -d -in sig_clean.txt -out sig.der

3. 直接验证哈希值(排除原始数据干扰)

既然已确认C#与OpenSSL的摘要一致,可跳过原始数据处理,直接验证哈希的签名:

# 将C#中输出的b64_hex(如"ABC123...")保存为digest.hex文件
# 转换为二进制格式
xxd -r -p digest.hex > digest.bin
# 验证哈希签名
openssl dgst -sha256 -verify pubkey.pem -signature sig_der.der digest.bin

4. 确认曲线与哈希算法匹配

检查公钥的曲线信息,确保与签名使用的哈希算法匹配:

openssl ec -pubin -in pubkey.pem -text -noout

比如256位曲线(prime256v1)对应SHA256,384位曲线对应SHA384,两者不匹配也会导致验证失败。


内容的提问来源于stack exchange,提问作者Brânica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:41:01