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

XML数字签名使用W3C RSA-SHA256算法遇不支持问题求解决方案

解决方案:Java XML数字签名使用RSA-SHA256报错的处理

核心问题分析

你遇到的java.security.NoSuchAlgorithmException主要源于两个问题:

  • 算法URI错误:代码中使用的http://www.w3.org/2000/09/xmldsig#rsa-sha256并非RSA-SHA256的标准URI,正确标识应为http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
  • JDK或安全提供者限制:Java 7及更早版本默认不支持SHA2系列的XML数字签名算法,部分Java 8+环境也可能需要额外配置安全提供者

步骤1:修正算法URI

将代码中的签名方法URI替换为标准值:

SignedInfo si = fac.newSignedInfo(
    fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, null),
    fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null),
    references
);

步骤2:升级JDK(优先推荐)

若项目仍在使用Java 7或更早版本,直接升级到Java 8及以上。Java 8开始默认的XMLDSig实现已原生支持RSA-SHA256等SHA2系列算法,无需额外配置。


步骤3:添加BouncyCastle安全提供者(升级JDK后仍报错时使用)

如果升级JDK后问题依旧,可通过引入BouncyCastle扩展算法支持:

  1. 添加Maven依赖:
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.70</version>
</dependency>
  1. 在代码开头注册BouncyCastle提供者:
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

Security.addProvider(new BouncyCastleProvider());
  1. 重新执行签名代码即可。

验证注意事项

确保签名验证方使用相同的算法URI,且环境支持该算法,避免出现验证失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:25:14