支付寶小程序:支付寶開放平臺應用上云:私鑰保護方案

小編:啊南 119閱讀 2020.12.21

一、支付寶開放平臺的公私鑰機制 

支付寶開放平臺的應用管理體系,使用了公私鑰的機制,來保障商戶應用和支付寶交互的安全性。這一機制包括兩個部分:

  1. 商戶應用使用自己的私鑰對消息加簽之后,將消息和簽名傳遞給支付寶,支付寶則使用應用的公鑰驗證消息的真實性(來自于合法應用的真實消息)。
  2. 對于支付寶返回消息給商戶應用的情形,應用則使用支付寶的“平臺公鑰”來驗證返回消息的真實性。


下圖簡單描述了上述第一部分的交互機制: 



這一機制的關鍵前提假定是: 商戶應用必須保障應用私鑰的安全性,從而保障應用和和支付寶交互的安全性。 

反之,一旦私鑰發生泄露,商戶則會面臨較大的安全風險。若應用和支付寶的交互涉及到資金類接口則風險更甚。 



二、阿里云KMS帶來的價值 


相比于在應用中使用應用私鑰的明文來對消息進行加簽,阿里云KMS為用戶帶來了如下幾個方面的優勢: 

  1. 保障私鑰安全性:用戶可以將簽名私鑰安全托管在 KMS的托管密碼機 內。用戶通過KMS的開放API使用私鑰加簽時,私鑰會在密碼機的硬件安全邊界之內,完成運算后返回簽名值,從而防止私鑰的泄露。
  2. 控制誰可以使用私鑰:用戶可以通過阿里云訪問控制服務(RAM服務),中心化的管理和控制誰可以使用KMS中的密鑰,用于應用加簽。
  3. 審計對私鑰的調用日志:通過阿里云操作審計服務可以查看每一次調用KMS的記錄;而商家應用自行保管私鑰則很難產生“客觀”的審計事件。
  4. 對安全事件的響應能力:在應用系統遭遇惡意者攻擊等安全事件的情形下,也可以通過多種手段阻止對私鑰的非法使用:例如用戶可以通過RAM服務撤銷對私鑰的使用權限,或者通過KMS禁用私鑰等。 





三、使用阿里云KMS配置應用密鑰 第一步:在阿里云KMS中創建應用密鑰 


  1. 登錄阿里云KMS的 管理控制臺。
  2. 在左上角的地域選擇欄,選擇合適的地域。通常情況下,建議您選擇和應用部署相同的KMS地域創建密鑰。
  3. 點擊 創建密鑰,選擇密鑰類型和密鑰用途。
    • 密鑰類型使用 RSA_2048。
    • 密鑰用途選擇 Sign/Verify。
    • 保護級別選擇 Hsm,即通過KMS系統的硬件加密機產生和保護密鑰 



第二步:在支付寶配置應用密鑰 

支付寶開放平臺提供了兩種配置方法,普通公鑰方式公鑰證書方式。


公鑰證書方式是對普通公鑰方式的增強機制,從數字簽名的角度來看,機制大同小異,商戶應用只需要二選一即可。注意:對于涉及到資金往來的商戶應用,應當使用公鑰證書的方式。


方法一:普通公鑰方式 

以下步驟參考支付寶開放平臺普通公鑰方式,并做恰當修改:

  1. 在阿里云KMS的管理控制臺,選擇之前創建的RSA_2048類型的密鑰,進入詳情頁之后,點擊查看公鑰可以復制或者下載應用公鑰。
  2. 進入 支付寶開放平臺 并打開對應的應用,在應用的開發配置頁面進行 接口加簽方式 設置。點擊 設置 后,輸入手機驗證碼。
  3. 復制上一步生成的公鑰,粘貼到 填寫公鑰字符 對應的位置,點擊 保存設置,即可完成公鑰的設置。 




普通公鑰方式的一句話總結:從阿里云KMS獲取應用公鑰,注冊到支付寶開放平臺對應的應用中。


方法二:公鑰證書方式 

以下步驟參考支付寶開放平臺公鑰證書方式,并做恰當修改:

  1. 在阿里云KMS的管理控制臺,選擇之前創建的RSA_2048類型的密鑰,進入詳情頁之后,點擊 生成CSR。注意:填寫證書屬性時,企業/單位名稱 一定要和開發者中心門戶賬號信息的公司名稱保持一致,否則會導致后續步驟中上傳 CSR 證書文件校驗失敗。 


        


  1. 進入 支付寶開放平臺 并打開對應的應用,在應用的開發配置頁面進行 接口加簽方式 設置。點擊 設置 后,輸入手機驗證碼。
  2. 加簽模式 選擇 公鑰證書 ,上傳證書文件 選擇 上傳CSR文件在線生成證書。最后點擊 上傳CSR文件在線生成證書,即可完成公鑰證書的設置。 


        


公鑰證書方式的一句話總結:從阿里云KMS獲取應用私鑰的證書請求 CSR,到支付寶開放平臺一鍵完成應用證書簽發和注冊。 



四、應用中調用阿里云KMS 

支付寶開放平臺新版SDK,也就是EasySDK集成了阿里云KMS作為加簽提供器(Sign Provider),簡化使用。以Java為例,您需要在應用中引用EasySDK 2.0.1以及之后的版本

<dependency>
 <groupId>com.alipay.sdk</groupId>
 <artifactId>alipay-easysdk</artifactId>
 <version>2.0.1</version> <!-- 必須 >= 2.0.1 -->n</dependency>

當然,如果遵循支付寶開放API的簽名規則,也可以不使用EasySDK,通過阿里云KMS的AsymmetricSign接口自行實現簽名。 


代碼示例:普通公鑰方式 

本示例來自于阿里云KMS的Github代碼樣例庫。 


package com.aliyun.kms.samples;nnimport com.alipay.easysdk.base.qrcode.models.AlipayOpenAppQrcodeCreateResponse;nimport com.alipay.easysdk.factory.Factory;nimport com.alipay.easysdk.kms.aliyun.AliyunKMSConfig;nimport com.google.gson.Gson;nimport com.google.gson.reflect.TypeToken;nnimport java.io.InputStream;nimport java.io.InputStreamReader;nimport java.util.Map;nn/**n * Alipay-easysdk使用KMS簽名示例,本示例展示了公鑰模式調用n */npublic class KmsAlipayEasySDKPublicKeyDemo {
 public static void main(String[] args) {
     Factory.setOptions(getOptions());
     try {
         AlipayOpenAppQrcodeCreateResponse response = Factory.Base.Qrcode().create("page/component/component-pages/view/view", "x=1", "二維碼描述");
         if ("10000".equals(response.code)) {
             System.out.println("調用成功");
         } else {
             System.err.println("調用失敗,原因:" + response.msg + "," + response.subMsg);
         }
     } catch (Exception e) {
         System.err.println("調用遭遇異常,原因:" + e.getMessage());
         throw new RuntimeException(e.getMessage(), e);
     }
 }n
 private static AliyunKMSConfig getOptions() {
     AliyunKMSConfig config = new AliyunKMSConfig();
     config.protocol = "https";
     config.gatewayHost = "openapi.alipay.com";
     config.signType = "RSA2";n
     // 請更換為您的AppId
     config.appId = "202100****";
     // 請修改如下的支付寶公鑰字符串為自己的支付寶公鑰
     config.alipayPublicKey = "MIIBIjANB...";n
     // 如果使用阿里云KMS簽名,則需要指定簽名提供方名稱,阿里云KMS的名稱為"AliyunKMS"
     config.signProvider = "AliyunKMS";n
     // 如果使用阿里云KMS簽名,請更換為您的阿里云AccessKeyId
     config.aliyunAccessKeyId = getAliyunAccessKey("AccessKeyId");
     // 如果使用阿里云KMS簽名,請更換為您的阿里云AccessKeySecret
     config.aliyunAccessKeySecret = getAliyunAccessKey("AccessKeySecret");
     // 如果使用阿里云KMS簽名,請更換為您的KMS服務密鑰ID
     config.kmsKeyId = "4358f298-8e30-4849-9791-****";
     // 如果使用阿里云KMS簽名,請更換為您的KMS服務密鑰版本ID
     config.kmsKeyVersionId = "e71daa69-c321-4014-b0c4-****";n
     // 如果使用阿里云KMS簽名,需要更換為您的KMS服務地址
     // KMS服務地址列表詳情,請參考:
     // https://help.aliyun.com/document_detail/69006.html
     config.kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";n
     return config;
 }n
 /**
  * 從文件中讀取阿里云AccessKey配置信息
  * 此處為了測試執行的環境普適性,AccessKey信息配置在resources資源下,實際過程中請不要這樣做。
  *
  * @param key AccessKey配置對應的key
  * @return AccessKey配置字符串
  */
 private static String getAliyunAccessKey(String key) {
     InputStream stream = KmsAlipayEasySDKPublicKeyDemo.class.getResourceAsStream("/fixture/aliyunAccessKey.json");
     Map<String, String> result = new Gson().fromJson(new InputStreamReader(stream), new TypeToken<Map<String, String>>() {
     }.getType());
     return result.get(key);
 }n}n


代碼示例:公鑰證書方式 


使用公鑰證書模式時,EasySDK的使用方式和上述示例類似,區別主要在于配置了商戶應用和支付寶平臺的公鑰證書。 

關聯標簽:
欧美日韩在线精品视频二区_日本高清在线精品一区_天天看片天天av免费观看