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

PKIJS本地签名验证失败,OpenSSL签名验证正常问题求助

问题分析与解决方案

核心原因:签名算法不兼容

验证失败的根源是私钥导入时指定的签名算法与OpenSSL默认使用的算法不一致,导致PKIJS生成的签名格式无法通过自身验证,而OpenSSL生成的签名(匹配默认算法)可以正常通过。

1. 密钥加载的关键问题

你在导入私钥时使用了RSA-PSS算法,但OpenSSL的cms -sign命令默认采用的是RSASSA-PKCS1-v1_5算法。这两种签名算法的验证逻辑不兼容,直接导致了自定义签名验证失败。

2. 具体修复步骤

步骤1:修改私钥导入算法

将loadPEM方法中私钥导入的算法替换为RSASSA-PKCS1-v1_5,与OpenSSL默认行为对齐:

case "PRIVATE KEY":
    for( const ber of bers) 
        ret.push(await crypto.importKey("pkcs8", ber, {
            name: "RSASSA-PKCS1-v1_5", // 替换原有的RSA-PSS
            hash: "SHA-256",
            },
            true,
            ["sign"]));
    return ret;

步骤2:(可选)若需保留RSA-PSS算法

如果确实需要使用RSA-PSS,需在signData方法中补充指定PSS参数,确保签名与验证逻辑一致:

// 修改signData中的sign调用,添加RSA-PSS参数
await cmsSigned.sign(privateKey, 0, "SHA-256", data, {
    signatureAlgorithmParams: new RSASSA_PSS_params({
        hashAlgorithm: new AlgorithmIdentifier({
            algorithm: "SHA-256"
        }),
        maskGenAlgorithm: new AlgorithmIdentifier({
            algorithm: "MGF1",
            parameters: new AlgorithmIdentifier({
                algorithm: "SHA-256"
            })
        }),
        saltLength: 32 // SHA-256哈希长度对应盐长度
    })
});

同时验证时需确保配置相同的算法参数,避免不匹配。

步骤3:验证修复效果

修改后重新运行代码,自定义signData生成的签名即可通过verify方法验证,返回true。

额外说明

PKIJS的sign方法会根据私钥算法自动适配,但手动指定不匹配的算法会导致签名格式错误。OpenSSL的CMS签名默认使用PKCS1v15,对齐算法后即可解决验证失败问题。


内容的提问来源于stack exchange,提问作者lviggiani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:40