日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/4 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AlipaySDKNet 是 .NET 平臺(tái)下用于對(duì)接支付寶支付的官方 SDK。Alipay SDK for .NET 讓您不用復(fù)雜編程即可訪問支付寶開放平臺(tái)開放的各項(xiàng)能力,SDK可以自動(dòng)幫您滿足能力調(diào)用過程中所需的證書校驗(yàn)、加簽、驗(yàn)簽、發(fā)送HTTP請(qǐng)求等非功能性要求。其 Nuget 鏈接如下:

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

GitHub 開源地址為:

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

要在程序中集成支付寶支付其實(shí)并不困難,只要謹(jǐn)記 .NET 程序要用的私鑰格式是 PKCS1 且不把參數(shù)搞混,問題應(yīng)該都不大。

但是今天,卻遇到了障礙:之前正常工作的代碼在更換了賬戶配置(APPID、私鑰等)之后竟然報(bào)錯(cuò)了。

Aop.Api.AopException: RSA簽名遭遇異常,請(qǐng)檢查私鑰格式是否正確。Index was outside the bounds of the array.

根據(jù)報(bào)錯(cuò)時(shí)的堆棧信息,該錯(cuò)誤來自于方法:

Aop.Api.Util.Asymmetric.RSAEncryptor.BuildRSAServiceProvider

?本著先從自己找原因的原則從頭到尾檢查了配置參數(shù):PKCS1 格式是對(duì)的、私鑰是對(duì)的、公鑰是對(duì)的甚至點(diǎn)鼠標(biāo)的手勢(shì)也是對(duì)的。

嘗試了 Java 語言的 DEMO (其采用的是 PKCS8 格式),這套參數(shù)也是可以正常工作的那就說明密鑰本身是沒問題的。

無奈之下只能通過 GitHub 將代碼克隆到本地并引入項(xiàng)目開始調(diào)試。找到報(bào)錯(cuò)位于 RSAEncryptor 的 BuildRSAServiceProvider 方法:

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

這個(gè)方法的作用是讀取 PKCS1 格式私鑰并構(gòu)建 RSACryptoServiceProvider ,但轉(zhuǎn)換過程略顯過時(shí)。其實(shí),.NET 在 netstandard-2.1 時(shí)已經(jīng)提供了名為 ImportRSAPrivateKey 的方法用于導(dǎo)入密鑰,這段代碼可以直接被替換掉。

首先將 AlipaySDKNet.Standard 的目標(biāo)框架修改為 netstandard2.1 ,接著使用以下代碼替換掉 BuildRSAServiceProvider 方法的實(shí)現(xiàn):

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

再次編譯項(xiàng)目,已經(jīng)可以正常下單使用了。

問題找到了,然后呢?

換一個(gè)密鑰是最簡(jiǎn)單的方案。想要向阿里反饋這個(gè)問題,卻發(fā)現(xiàn)該倉(cāng)庫(kù)并未開放 Issues 功能。我也想退而求其次,不要在項(xiàng)目中引入整個(gè) SDK 的源代碼(它太大了,有一萬五千多個(gè)文件)而只對(duì) SDK 打補(bǔ)丁。但我發(fā)現(xiàn)這很難做到:DefaultAopClient 的實(shí)現(xiàn)看上去很復(fù)雜,而且 BuildRSAServiceProvider 被定義為了一個(gè)私有的靜態(tài)方法。

如何復(fù)現(xiàn)這個(gè)問題?

我當(dāng)然不能把我現(xiàn)在使用的私鑰共享出來,但我做了一些工作又生成了一個(gè)會(huì)報(bào)錯(cuò)的私鑰(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

你也可以使用以下代碼自己測(cè)試。該代碼循環(huán)100次,并使用支付寶 SDK 提供的方法對(duì)密鑰進(jìn)行轉(zhuǎn)換:

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));} }

筆者的測(cè)試結(jié)果是:100 次生成大概會(huì)有 2-4 次遇到異常密鑰。

如果你遇到了和筆者一樣的問題,并且通讀本文解決了你的問題。那么恭喜你,你大概就是天選之子,下班后去買彩吧,說不定能中。

后記

受制于筆者的知識(shí)淺薄,本文并沒有找到 BuildRSAServiceProvider 不能正確加載私鑰的根本原因,而是使用另一種方法規(guī)避了該問題。這讓我更加堅(jiān)信,即便是大廠的作品也不是完美無瑕。

簡(jiǎn)單總結(jié)一下:如果你遇到了本文所述的問題,那么就重置一下密鑰吧。植發(fā)畢竟太貴了。

總結(jié)

以上是生活随笔為你收集整理的支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。