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

如何为ASP.NET(.NET Framework 4.8)启用SHA-256哈希算法?

解决WSE 2.0 + .NET Framework 4.8启用SHA-256签名的问题

1. 提前注册SignatureDescription

WSE 2.0的签名机制初始化较早,仅在代理类构造函数中注册RSAPKCS1SHA256SignatureDescription可能为时已晚,需在应用启动最早期完成注册:

  • 在Global.asax的Application_Start方法中调用注册逻辑:
protected void Application_Start(object sender, EventArgs e)
{
    CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), 
        "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
}

2. 校验machine.config配置准确性

确保machine.config中的加密配置完全匹配你的代码结构,重点检查命名空间和程序集名称:

<configuration>
  <mscorlib>
    <cryptographySettings>
      <cryptoNameMapping>
        <cryptoClasses>
          <!-- 替换为你的类的完整命名空间和程序集名称 -->
          <cryptoClass RSASHA256SignatureDescription="YourAppNamespace.RSAPKCS1SHA256SignatureDescription, YourAppAssembly" />
        </cryptoClasses>
        <nameEntry name="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" class="RSASHA256SignatureDescription" />
        <nameEntry name="SHA256" class="RSASHA256SignatureDescription" />
      </cryptoNameMapping>
    </cryptographySettings>
  </mscorlib>
</configuration>
  • 注意:Windows Server 2019中machine.config的64位路径为C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config,32位路径为C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config,需根据应用架构修改对应文件。

3. 强制指定SOAP签名算法URI

WSE依赖标准XMLDSIG算法URI识别签名类型,仅设置SHA-256字符串无效,需使用完整URI:

// 获取请求SOAP上下文
var requestContext = proxy.RequestSoapContext;

// 添加客户端证书令牌
var signingCert = new X509Certificate2("client_cert.pfx", "cert_password");
var securityToken = new X509SecurityToken(signingCert);
requestContext.Security.Tokens.Add(securityToken);

// 创建签名并指定SHA-256算法URI
var signature = new Signature(securityToken);
signature.SignatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
signature.SignatureOptions = SignatureOptions.IncludeAddressing | SignatureOptions.IncludeTimestamp | SignatureOptions.IncludeSoapBody;

requestContext.Security.Elements.Add(signature);

4. 确认证书私钥绑定正确CSP

确保客户端证书的私钥使用支持SHA-256的加密服务提供商:

  • 用代码验证当前CSP:
var cert = new X509Certificate2("client_cert.pfx", "password", X509KeyStorageFlags.Exportable);
var rsa = cert.PrivateKey as RSACryptoServiceProvider;
if (rsa != null)
{
    // 正确输出应为"Microsoft Enhanced RSA and AES Cryptographic Provider"
    Console.WriteLine(rsa.CspKeyContainerInfo.ProviderName);
}
  • 若CSP不正确,可重新导入证书并选择指定CSP,或用代码重新绑定:
var cspParams = new CspParameters
{
    ProviderType = 24, // 对应Microsoft Enhanced RSA and AES Cryptographic Provider
    ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider",
    KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName,
    Flags = CspProviderFlags.UseExistingKey
};
var newRsa = new RSACryptoServiceProvider(cspParams);
newRsa.ImportParameters(rsa.ExportParameters(true));
cert.PrivateKey = newRsa;

5. 配置注册表强制强加密

在注册表中添加条目,强制.NET Framework使用强加密算法:

  • 打开注册表编辑器,定位到以下路径:
    • 64位:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
    • 32位:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319
  • 添加DWORD值SchUseStrongCrypto,设置为1

6. 调试验证

  • 用Fiddler抓包,检查SOAP请求的<ds:Signature>节点中<ds:SignedInfo><ds:SignatureMethod>的Algorithm属性是否为http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
  • 在代码中添加日志,验证SignatureDescription注册状态:
var desc = CryptoConfig.CreateFromName("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
if (desc == null)
{
    // 注册失败,检查命名空间、程序集名称和配置
}
else
{
    // 注册成功
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:34:56