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

