當前位置:編程學習大全網 - 編程語言 - 支付寶 .NET SDK 報錯:RSA簽名遭遇異常,請檢查私鑰格式是否正確

支付寶 .NET SDK 報錯:RSA簽名遭遇異常,請檢查私鑰格式是否正確

AlipaySDKNet 是 .NET 平臺下用於對接支付寶支付的官方 SDK。Alipay SDK for .NET 讓您不用復雜編程即可訪問支付寶開放平臺開放的各項能力,SDK可以自動幫您滿足能力調用過程中所需的證書校驗、加簽、驗簽、發送HTTP請求等非功能性要求。其 Nuget 鏈接如下:/alipay/alipay-sdk-net-all 。

要在程序中集成支付寶支付其實並不困難,只要謹記 .NET 程序要用的私鑰格式是 PKCS1 且不把參數搞混問題應該都不大。

但是今天,卻遇到壹個大問題: 之前 正常工作的代碼在更換了賬戶配置(APPID、私鑰等)之後竟然報錯了。

根據報錯時的堆棧信息,該錯誤來自於方法:

本著先從自己找原因的原則沖頭到尾檢查了配置參數,PKCS1 格式是對的、私鑰是對的、公鑰是對的甚至點鼠標的手勢也是對的。

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

無奈之下只能通過 GitHub 將代碼克隆到本地並引入項目開始調試。找到報錯斷點位於 RSAEncryptor 的 BuildRSAServiceProvider 方法:

/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 方法:

再次編譯項目,已經可以正常下單使用了。

換壹個密鑰也許是最簡單的方案。想要向阿裏反饋這個問題,卻發現該倉庫並未開放 Issues 功能。我也想退而求其次,不要在項目中引入整個 SDK 的源代碼(它太大了,有壹萬五千多個文件)只對 SDK 打補丁。但我發現這很難做到:DefaultAopClient 的實現看上去很復雜,而且 BuildRSAServiceProvider 被定義為了壹個私有的靜態方法。

我當然不能把我現在使用的私鑰***享出來,但我做了壹些工作又生成了壹個會報錯的私鑰(PKCS1 格式):

妳也可以使用以下代碼嘗試生成並測試,該代碼循環100次,並嘗試用阿裏 SDK 提供的方法對密鑰進行轉換:

經測試,壹百次生成中大概會有 2-4 次遇到異常密鑰。

如果妳遇到了和筆者壹樣的問題,並且通讀本文解決了妳的問題。那麽恭喜妳,妳大概就是天選之子,下班後去買彩吧,說不定能中大獎。

受制於筆者的淺薄,本文並沒有找到 BuildRSAServiceProvider 不能正確加載私鑰的原因,但使用另壹種方法規避了該問題。這讓我更加堅信,即便是大廠的作品也不是完美無瑕。

簡單總結壹下:如果妳遇到了本文所述的問題,那麽就重置壹下密鑰吧。植發畢竟太貴了。

閱讀原文:支付寶 .NET SDK 報錯:RSA簽名遭遇異常,請檢查私鑰格式是否正確。-碼農很忙

  • 上一篇:函數的定義是什麽!
  • 下一篇:壹個python中嵌套列表的問題,下圖中的兩種寫法,結果不壹樣,這是為什麽?
  • copyright 2024編程學習大全網