iText7中ECDSA签名OID使用错误致ETSI合规校验失败问题咨询
结论
这是iText7签名模块的明确实现缺陷,必须使用和签名哈希算法匹配的ECDSA组合OID作为CMS结构中SignatureAlgorithmIdentifier字段的值,不能使用1.2.840.10045.2.1。
原因说明
- 两个OID的适用场景完全不同:
1.2.840.10045.2.1是ecPublicKey椭圆曲线公钥类型标识,仅允许出现在证书的SubjectPublicKeyInfo字段中,用于标记公钥所属的算法类型,本身不包含任何哈希算法信息,完全不符合签名算法标识符的字段定义要求。 - 按照RFC 5652(CMS标准)、ETSI EN 319 122系列PDF电子签名标准的强制要求,
SignatureAlgorithmIdentifier字段必须填写「哈希算法+签名算法」组合对应的全局唯一OID,你列出的四个带哈希后缀的OID才是ECDSA签名场景下的合规取值:public static final String ID_ECDSA_SHA224 = "1.2.840.10045.4.3.1"; public static final String ID_ECDSA_SHA256 = "1.2.840.10045.4.3.2"; public static final String ID_ECDSA_SHA384 = "1.2.840.10045.4.3.3"; public static final String ID_ECDSA_SHA512 = "1.2.840.10045.4.3.4"; - 你观察到的「Adobe Acrobat可正常校验、ETSI合规工具报错」的差异,来自两类工具的校验逻辑差异:
Adobe Acrobat为了兼容历史上各类不规范的签名实现,做了大量容错逻辑,遇到签名算法OID填错的场景,会自动根据证书公钥类型、签名值ASN.1结构反推实际使用的签名算法,因此不会抛出错误。但这种容错不代表签名实现符合标准要求。
ETSI合规校验工具严格遵循标准规则做匹配,没有额外容错逻辑,识别到字段中填入的是公钥类型OID后,无法拼接出合法的哈希算法+签名算法组合,就会抛出Unknown signature type requested: SHA256With1.2.840.10045.2.1错误。
修复注意事项
- 不要直接修改
SecurityIDs类中ID_ECDSA常量的取值,这个常量本身服务于公钥类型识别、证书解析逻辑,全局替换会导致其他依赖该常量的功能出现异常。 - 正确修复方式是修改
PdfPKCS7类中生成签名算法标识符的逻辑分支:当检测到签名使用的是EC密钥时,根据实际选用的哈希算法,动态匹配对应带哈希后缀的ECDSA OID填入SignatureAlgorithmIdentifier字段即可。 - 填入上述组合OID时,算法标识符的参数字段必须省略,不要沿用原逻辑填充
NULL,否则会触发新的ETSI合规校验错误。
内容的提问来源于stack exchange,提问作者user3036788
相关产品推荐
相关产品推荐

