支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。

AlipaySDKNet 是 .NET 平台下用于对接支付宝支付的官方 SDK。Alipay SDK for .NET 让您不用复杂编程即可访问支付宝开放平台开放的各项能力,SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。其 Nuget 链接如下:

https://www.nuget.org/packages/AlipaySDKNet.Standard 

GitHub 开源地址为:

https://github.com/alipay/alipay-sdk-net-all 

要在程序中集成支付宝支付其实并不困难,只要谨记 .NET 程序要用的私钥格式是 PKCS1 且不把参数搞混,问题应该都不大。

但是今天,却遇到了障碍:之前正常工作的代码在更换了账户配置(APPID、私钥等)之后竟然报错了。

Aop.Api.AopException: RSA签名遭遇异常,请检查私钥格式是否正确。Index was outside the bounds of the array.

根据报错时的堆栈信息,该错误来自于方法:

Aop.Api.Util.Asymmetric.RSAEncryptor.BuildRSAServiceProvider

 本着先从自己找原因的原则从头到尾检查了配置参数:PKCS1 格式是对的、私钥是对的、公钥是对的甚至点鼠标的手势也是对的。

尝试了 Java 语言的 DEMO (其采用的是 PKCS8 格式),这套参数也是可以正常工作的那就说明密钥本身是没问题的。

无奈之下只能通过 GitHub 将代码克隆到本地并引入项目开始调试。找到报错位于 RSAEncryptor 的 BuildRSAServiceProvider 方法:

https://github.com/alipay/alipay-sdk-net-all/blob/98fc187884d628d4268504bc0b93eb9a1aae417a/AlipaySDKNet.Standard/Util/Asymmetric/RSAEncryptor.cs#L234

这个方法的作用是读取 PKCS1 格式私钥并构建 RSACryptoServiceProvider ,但转换过程略显过时。其实,.NET 在 netstandard-2.1 时已经提供了名为 ImportRSAPrivateKey 的方法用于导入密钥,这段代码可以直接被替换掉。

首先将 AlipaySDKNet.Standard 的目标框架修改为 netstandard2.1 ,接着使用以下代码替换掉 BuildRSAServiceProvider 方法的实现:

private static RSACryptoServiceProvider BuildRSAServiceProvider(byte[] privateKey)
{var rsa = new RSACryptoServiceProvider();rsa.ImportRSAPrivateKey(privateKey, out _);return rsa;
}

再次编译项目,已经可以正常下单使用了。

问题找到了,然后呢?

换一个密钥是最简单的方案。想要向阿里反馈这个问题,却发现该仓库并未开放 Issues 功能。我也想退而求其次,不要在项目中引入整个 SDK 的源代码(它太大了,有一万五千多个文件)而只对 SDK 打补丁。但我发现这很难做到:DefaultAopClient 的实现看上去很复杂,而且 BuildRSAServiceProvider 被定义为了一个私有的静态方法。

如何复现这个问题?

我当然不能把我现在使用的私钥共享出来,但我做了一些工作又生成了一个会报错的私钥(PKCS1 格式):

MIIEowIBAAKCAQEApkzj3sk+hpd2e0d8BUbDkuL6khflsJLzoQwGq25mm5fn2MDN3MPl/h0/XtWoM6OOIigvQFFj295UxN/I4oGrWL/oYA0g2MWlttLHPZ2ivhCSSizw9OJtAg8NgmkDM8dygAhyUQja2ZoACWrNrQa4DC10GXpRi/85ZGMEBcKZnUwlwYan31rVtgdULZ0l+W3yiWYtMaGKoT/BWQZ3bjUzCU/OxcuCK6Z/YUho65YxJa/zQdTmduxW7ghgGILqvoyh1PS1Zb+JeCJ3t6rxsoCDfKV7ldMUrWYKjMewvj6JritxgsmF/E80f12mMqDimLhJX8nTqQQ2kajEazkvZQNxaQIDAQABAoIBAACq2FNBjX2ux+vwun+u7AP/4y+I5wQRYubnjHNNqx2+u1B0XZ8gLiEZ7vIre1RRuLVMYfwpF3R/bOmpWD4IdS6S/pS8GMCl8mdMaz5FDq0ileO0UHc7HWLfupcmYrvndf8riYHnvjEXXB6tjgu+tiheWlPr2L3uFUXg29hGEqW98dSffYIWrdYOcFa1wWnR6w+FOEXqGcAppKKADosHCqA8S5M+tPcGbZ/PIJwcJEx+GsXsy1aoslB6hgAyJOmnY2w2o5V30I1QzhgiwCGAHK4pNABRtXwzGnSjfzdkrUb0irytvFrHj/RMuYHFaEJ8cSnc/c2sh87Zia5e6H6I+00CgYEA1d6oRlMCpfleUee0jl7KsGnqdoquipC7vNVjfPsSuGbXy9NRt/N4rSymfHsQA8zExmHfQjtk3kS64HXkUZRVrACNCLM6mgcEEshixRntaZJdA+RruPb45JBkhnjtmmQJ4BY06GTqtsflnaPJEv5wvReBlByThOcHI+fcOeUYfGcCgYEAxw9VAZfXxeVGT/+7skxxu1568OyrS7tysaMVy6Uufztd6hY3ZT+VV1QFxj8fku9miVFLCvhU4Z3HrahRmGNZ7XT0Cgm8ZhFhKKR7gQlAMAmLeSGgAUbjQ3BEKG5NXKqsFpAisoEV5/MoZ3eQuVGQ5JApbKZlhIVOX2Kq9gqmAa8CgYEAhfT9n3a1DPKBsnmX7SjQeekNc4xvwNjgzmk19H1qf1fjSIanA7obVxTFfuix4j9q7Ps2lMyQ5GtWRetxw+tOMfryW4WvafSFB6K9wsj3nI2RdzOmiWcgBEGwxU2PPYn1aYdfQkSbgzr3xmJlOmFmifnkLroraC4wmbvLg/PL/3cCgYA25PKDSvV1HIIkY5jGVbBzhF2Q/SNL8jhx5lCHZVkKOzvt5wyFvmAXwhMJlbTGV4DGU4XHU65Mva8oI6fEx3kwM7Vs4zxyRU6u35Uzg3KRDMDKucwfLgZUPax+HdT1vhdQ7ZSz90csPPEif2WIxYaYkWzrCoQqZHy1b0dILK2U/wKBgFAmZrWiB1mLp8hdLp49Fctf+KKH16t6CkhEzh0s+ElaRcuLQ/+m5nGSxBbPm7QeLxZBD12ugnj0czcRPfjWDNDTHghnXr+DNsVuQ8oUdrCQpwHgHpoeOzZaoX1RSSRceuZOiRaDJM/rf1CGi/LcXIE0YvlJF/eDCTlx6cOTFn7T

你也可以使用以下代码自己测试。该代码循环100次,并使用支付宝 SDK 提供的方法对密钥进行转换:

for (int i = 0; i < 100; i++)
{var rsa = RSA.Create();var keys = rsa.ExportRSAPrivateKey();try{BuildRSAServiceProvider(keys);}catch (Exception ex){Console.WriteLine(Convert.ToBase64String(keys));}
}

笔者的测试结果是:100 次生成大概会有 2-4 次遇到异常密钥。

如果你遇到了和笔者一样的问题,并且通读本文解决了你的问题。那么恭喜你,你大概就是天选之子,下班后去买彩吧,说不定能中。

后记

受制于笔者的知识浅薄,本文并没有找到 BuildRSAServiceProvider 不能正确加载私钥的根本原因,而是使用另一种方法规避了该问题。这让我更加坚信,即便是大厂的作品也不是完美无瑕。

简单总结一下:如果你遇到了本文所述的问题,那么就重置一下密钥吧。植发毕竟太贵了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交友软件上的两种网友类型......

1 轻轻松松月入五千的方法&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 像极了期末复习的你&#xff08;via.段子楼&#xff0c;侵删&#xff09;▼3 听说你想要中国的熊猫▼4 听说学校附近有野人出没&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5…

meta标签的作用

meta标签共有两个属性&#xff0c;它们分别是http-equiv属性和name属性&#xff0c;不同的属性又有不同的参数值&#xff0c;这些不同的参数值就实现了不同的网页功能。 一.http-equiv属性 定义和用法&#xff1a;把 content 属性连接到 HTTP 头部&#xff0c;它可以向浏览器传…

iCloud7_Next Steps

下一步Next Steps 在此次指导中&#xff0c;你创建了一个复杂的iOS应用&#xff0c;使用iCloud保存它的文档。设计一个支持 iCloud 的应用程序&#xff0c;涉及很多决策&#xff0c;即使这样&#xff0c;本教程只触及表面&#xff08;浅层&#xff09;。当你继续了解集成 iClou…

operation 多线程

2.Cocoa Operation 优点&#xff1a;不需要关心线程管理&#xff0c;数据同步的事情。Cocoa Operation 相关的类是 NSOperation &#xff0c;NSOperationQueue。NSOperation是个抽象类&#xff0c;使用它必须用它的子类&#xff0c;可以实现它或者使用它定义好的两个子类&#…

Android插件化开发基础之Java动态代理(proxy)机制的简单例子

一、代码 package com.sangfor.tree;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;interface ProxyInterFace { public void proxyMethod(); } class TargetObject implements ProxyInterFace { publ…

python获取键盘事件_50-用Python监听鼠标和键盘事件

PyHook是一个基于Python的“钩子”库&#xff0c;主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32&#xff0c;如同名字所显示的&#xff0c;PyWin32只能运行在Windows平台&#xff0c;所以PyHook也只能运行在Windows平台。 关于PyHook的使用&…

解读最新的 Xamarin 更新

微软中国MSDN 点击上方蓝字关注我们Good news——Visual Studio 2022 包括了 Xamarin 对 Android 12和苹果最新的 Xcode 13 版本下的 iOS、iPadOS、macOS 和 tvOS 的支持&#xff0c;以及适用于支持它们的最新 Xamarin.Forms 版本。让我们一起来了解下最新 Xamarin版本&#x…

原来医生的处方不是随便乱写的...

1 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 像极了早上刚睡醒炸毛的你▼3 原来医生的处方不是瞎写的▼4 当爷爷不当孙子&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 40厘米的身高差&#xff08;素材来源网络&#xf…

Uva 11400,照明系统设计

题目链接&#xff1a;https://uva.onlinejudge.org/external/114/11400.pdf 题意&#xff1a;有一个照明系统需要用到n种灯&#xff0c;每种灯的电压为V&#xff0c;电源费用K&#xff0c;每个灯泡费用为C&#xff0c;需要该灯的数量为L。注意到&#xff0c;电压相同的灯泡只需…

Android之解决Gigaset手机不能设置DeviceOwner权限提示already provisioned问题

客户那里有Gigaset手机,安装我们的产品需要注入DeviceOwner,但是刚恢复默认出厂的Gigaset手机很奇葩,注入权限的提示下面错误,导致不能使用我们的产品 设置DeviceOwner权限是有限制的,需要手机账号(acount)为0 1 我们用命令查看手机的帐号 adb shell dumpsys account …

Python-理解装饰器

文章先由stackoverflow上面的一个问题引起吧&#xff0c;如果使用如下的代码&#xff1a; makebold makeitalic def say():return "Hello" 打印出如下的输出&#xff1a; <b><i>Hello<i></b> 你会怎么做&#xff1f;最后给出的答案是&#x…

收集网络状态(Ping),并用邮件通知管理员

在没有第三方工具对网络进行监控的话&#xff0c;要检查网络中某台主机&#xff0c;或是某个IP地址通讯是否正常&#xff0c;我们通常用手动PING来进行测试。有了PowerShell&#xff0c;我们可以用他定时Ping网络上的几个IP地址&#xff0c;然后把ping的个延时时间用邮件通知给…

sql 某列数据全部为0则不显示该列_数据产品经理养成记(五):汇总分析

学会了如何查找数据后&#xff0c;接下来就要对数据进行分析处理&#xff0c;比如求和、平均值、加总等等。这些对数据的加工处理通过汇总函数来实现。汇总函数在之前的两篇文章中都有涉及&#xff0c;这里采用概念--案例--总结的方式&#xff0c;集中介绍一下。1.什么是汇总函…

如何通过 反射 调用某个对象的私有方法?

咨询区 Jeromy Irvine我的类中有一组私有方法&#xff0c;我现在想根据灵活的输入值来动态调用其中的私有方法&#xff0c;代码类似是这个样子。MethodInfo dynMethod this.GetType().GetMethod("Draw_" itemType); dynMethod.Invoke(this, new object[] { methodP…

vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

解决linux下vim乱码的情况&#xff1a;(修改vimrc的内容&#xff09; 全局的情况下&#xff1a;即所有用户都能用这个配置 文件地址&#xff1a;/etc/vimrc 在文件中添加&#xff1a; set fileencodingsutf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencodingutf-8 set enco…

Android插件化开发之AMS与应用程序(客户端ActivityThread、Instrumentation、Activity)通信模型分析

转载来自&#xff1a;http://blog.csdn.net/qinjuning/article/details/7262769 今天主要分析下ActivityManagerService(服务端) 与应用程序(客户端)之间的通信模型&#xff0c;在介绍这个通信模型的基础上&#xff0c;再 简单介绍实现这个模型所需要数据类型。 本文所介绍内容…

深入了解JavaScript中的正则表达式构造函数和正则表达式字面量

正则表达式是在处理字符串时非常有用的工具&#xff0c;它可以帮助我们进行模式匹配、搜索和替换操作。在JavaScript中&#xff0c;我们可以使用正则表达式构造函数 RegExp 或正则表达式字面量来创建正则表达式对象。本文将深入探讨这两种方式的不同之处&#xff0c;并通过代码…

iOS开发UI篇—直接使用UITableView Controller

iOS开发UI篇—直接使用UITableView Controller 一、一般过程 1 //2 // YYViewController.h3 // UITableView Controller4 //5 // Created by 孔医己 on 14-6-2.6 // Copyright (c) 2014年 itcast. All rights reserved.7 //8 9 #import <UIKit/UIKit.h> 10 11 inter…

怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩

在之前视觉设计文章中&#xff0c;我把视觉设计大致罗列了四个方向&#xff0c;更多的是希望能够为大家带来一些努力方向&#xff0c;在设计的路上不那么困惑迷茫&#xff0c;视觉设计本身涵盖的范围就比较广&#xff0c;同时也没有什么衡量的标准和具体的特征&#xff0c;只有…