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
相关产品推荐
相关产品推荐

