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

C#使用PFX证书签名Token遇类型转换错误及结果不符问题

解决方案

1. 修复类型转换错误

RSACng和RSACryptoServiceProvider是.NET中不同的RSA实现,不能直接强制转换。改用通用的RSA基类来获取私钥,兼容所有RSA实现:

替换原代码中私钥获取的代码段:

// 替换原来的强转代码
using RSA rsa = certificate.GetRSAPrivateKey();
if (rsa == null)
{
    return "0";
}

2. 调整签名逻辑,匹配预期结果

签名结果不符通常由以下几点导致,逐一排查修正:

  • 明确签名算法参数:SHA256withRSA对应PKCS#1填充,调用SignData时指定明确的参数,避免算法歧义:
    byte[] signature = rsa.SignData(utf8Data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    
  • 验证消息内容:确保contentToEncode的内容和API要求完全一致,包括空格、标点、大小写等细节,任何差异都会导致签名结果不同。
  • 确认编码一致性:确认API是否要求使用UTF-8编码处理消息,如果API使用其他编码(如ASCII),需调整Encoding.UTF8为对应编码。
  • 检查证书有效性:确认使用的.pfx证书是API指定的,私钥未损坏,密码正确。

完整修正代码

public string HBLTxnToken()
{
    string contentToEncode = "HBL -531,0701,1,01900099870014,1,NPR,HBL-531,2101,1,0830122854100011,1,HBL@999";            
    X509Certificate2 certificate = new X509Certificate2(@"C://Users//nabinpr//Desktop//Code//Test File//HBL.pfx", "123");
    
    using RSA rsa = certificate.GetRSAPrivateKey();
    if (rsa == null)
    {
        return "0";
    }
    
    byte[] utf8Data = Encoding.UTF8.GetBytes(contentToEncode);
    byte[] signature = rsa.SignData(utf8Data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    return Convert.ToBase64String(signature);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:55:15