在支付寶開放平臺的應用體系中,應用私鑰是最核心的安全要素,使用密鑰管理服務KMS(Key Management Service)保護私鑰,可以極大的提高支付寶應用和小程序的安全性,幫助應用開發者保障業務和資金安全。
背景信息
支付寶開放平臺的應用管理體系采用公私鑰的機制,以保障商戶應用和支付寶交互的安全性。這一機制包括以下兩部分:
商戶應用使用自己的私鑰對消息加簽后,將消息和簽名傳遞給支付寶,支付寶則使用應用的公鑰驗證消息的真實性(來自于合法應用的真實消息)。
對于支付寶返回消息給商戶應用的情形,應用則使用支付寶的平臺公鑰來驗證返回消息的真實性。
該機制的前提是:商戶應用必須保障應用私鑰的安全性,從而保障應用和支付寶交互的安全性。反之,一旦私鑰發生泄露,商戶會面臨較大的安全風險。如果應用和支付寶的交互涉及到資金類接口則風險更大。
產品價值
相比于在應用中使用應用私鑰的明文來對消息進行加簽,KMS存在以下優勢:
保障私鑰安全性:用戶可以將簽名私鑰安全存放在KMS托管密碼機內。用戶通過KMS的OpenAPI使用私鑰加簽時,私鑰會在密碼機的硬件安全邊界之內,完成運算后返回簽名值,從而防止私鑰的泄露。托管密碼機詳情,請參見托管密碼機概述。
控制私鑰使用者:用戶可以通過阿里云訪問控制RAM(Resource Access Management),集中管控KMS密鑰使用成員,用于應用加簽。
審計對私鑰的調用日志:通過阿里云操作審計(ActionTrail)可以查看每一次調用KMS的記錄;而商家應用自行保管私鑰則很難產生客觀的審計事件。
靈活響應安全事件:在應用系統遭遇惡意者攻擊等情形下,可以通過多種手段阻止惡意者對私鑰的非法使用。例如:用戶可以通過RAM撤銷對私鑰的使用權限,或者通過KMS禁用私鑰等。
使用KMS控制臺為支付寶應用或小程序加簽
在KMS中創建密鑰。
登錄密鑰管理服務控制臺。
在頁面左上角的地域下拉列表,選擇密鑰所在的地域。
建議您選擇和支付寶應用或小程序相同的地域。
在左側導航欄,單擊用戶主密鑰。
單擊創建密鑰。
在彈出的創建密鑰對話框,根據以下表格進行配置。
配置項
說明
KMS實例
選擇默認。
密鑰類型
選擇RSA_2048。
密鑰用途
選擇Sign/Verify。
別名
輸入密鑰別名信息。
保護級別
選擇Hsm:通過KMS系統的硬件加密機產生和保護密鑰。
描述
輸入密鑰描述信息。
輪轉周期
默認為不開啟。
單擊確定。
在支付寶配置密鑰。
支付寶開放平臺提供了普通公鑰方式和公鑰證書方式兩種密鑰配置方法。公鑰證書方式是對普通公鑰方式的增強機制,從數字簽名的角度來看,二者機制大同小異,商戶應用只需要選擇其中一種即可。
說明對于涉及到資金往來的商戶應用,應當使用公鑰證書的方式。
方法一:普通公鑰方式
從KMS獲取應用公鑰,注冊到支付寶開放平臺對應的應用中。
登錄密鑰管理服務控制臺。
在頁面左上角的地域下拉列表,選擇密鑰所在的地域。
在左側導航欄,單擊用戶主密鑰。
找到已創建的RSA_2048類型密鑰,單擊別名進入詳情頁。
在密鑰版本區域,單擊查看公鑰。
在查看公鑰對話框,復制或下載公鑰。
登錄支付寶開放平臺。
打開需要加密的應用,在左側導航欄選擇開發設置。
在開發設置頁面,單擊接口加密方式右側的設置,閱讀接口加簽方式注意事項,然后點擊確定進入配置流程。
設置加簽方式,選擇
。生成密鑰文件。
下載并安裝支付寶開放平臺密鑰工具。
打開密鑰工具,進入生成密鑰功能。
加簽方式選擇密鑰,加簽算法選擇RSA2。(開放平臺暫未開放SM2的支持)
點擊生成密鑰,可以在結果頁中看到生成的應用公鑰、應用私鑰。
說明RSA2加密算法默認生成格式為PKCS8(Java適用),如需PKCS1格式(非Java適用),可使用格式轉換。
復制應用公鑰字符串。
返回開放平臺控制臺中,點擊下一步。
上傳應用公鑰。粘貼復制的應用公鑰字符串,點擊確認上傳。此時需要輸入短信驗證碼或支付密碼,完成安全驗證。
密鑰配置完成。
方法二:公鑰證書方式
從KMS獲取私鑰證書請求CSR,到支付寶開放平臺完成應用證書注冊和簽發。
登錄密鑰管理服務控制臺。
在頁面左上角的地域下拉列表,選擇密鑰所在的地域。
在左側導航欄,單擊用戶主密鑰。
找到已創建的RSA_2048類型密鑰,單擊別名進入詳情頁。
在密鑰版本區域,單擊生成CSR。
在生成CSR對話框,根據控制臺提示填寫證書信息。
說明企業/單位名稱必須和支付寶開發者中心門戶賬號信息的公司名稱保持一致,否則會導致后續步驟中上傳CSR證書文件校驗失敗。
登錄支付寶開放平臺。
打開需要加密的應用,在左側導航欄選擇開發設置。
在開發設置頁面,單擊接口加密方式右側的設置,閱讀接口加簽方式注意事項,然后點擊確定進入配置流程。
設置加簽方式,選擇證書>下一步。
生成CSR文件。
下載并安裝支付寶開放平臺密鑰工具。
打開密鑰工具,進入生成密鑰功能。
加簽方式選擇證書,加簽算法選擇RSA2。(開放平臺暫未開放SM2的支持)
填寫組織/公司,必須與開放平臺主賬號名稱完全相同。
點擊生成CSR文件,可以點擊打開文件位置查看生成的應用私鑰、應用公鑰和CSR文件。
返回開放平臺控制臺中,點擊下一步。
上傳生成的CSR文件,選擇證書到期后的處理方式(默認為自動簽發),設置安全聯系人信息,簽署開放平臺服務協議。點擊確認上傳。此時需要輸入短信驗證碼或支付密碼,完成安全驗證。
證書配置完成。
使用支付寶SDK調用KMS為支付寶應用或小程序加簽
支付寶開放平臺新版SDK(EasySDK)集成了KMS作為加簽提供器(Sign Provider),以簡化加簽操作。以Java SDK為例,您需要在支付寶應用中引用EasySDK 2.0.1以及之后的版本。
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.0.1</version>
</dependency>
如果遵循支付寶開放API的簽名規則,也可以不使用EasySDK,通過調用阿里云KMS的AsymmetricSign接口自行實現簽名。
代碼示例:普通公鑰方式
阿里云賬號AccessKey擁有所有OpenAPI的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
本示例以將AccessKey配置在環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身份驗證為例。
更多認證信息配置方式,請參見Credentials 設置。
不同操作系統的環境變量配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變量。
package com.aliyun.kms.samples;
import com.alipay.easysdk.base.qrcode.models.AlipayOpenAppQrcodeCreateResponse;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kms.aliyun.AliyunKMSConfig;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
/**
* Alipay-easysdk使用KMS簽名示例,本示例展示了公鑰方式調用。
*/
public 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);
}
}
private static AliyunKMSConfig getOptions() {
AliyunKMSConfig config = new AliyunKMSConfig();
config.protocol = "https";
config.gatewayHost = "openapi.alipay.com";
config.signType = "RSA2";
//請更換為您的AppID。
config.appId = "202100****";
//請修改如下的支付寶公鑰字符串為自己的支付寶公鑰。
config.alipayPublicKey = "MIIBIjANB...";
//如果使用阿里云KMS簽名,則需要指定簽名提供方名稱,阿里云KMS的名稱為"AliyunKMS"。
config.signProvider = "AliyunKMS";
config.aliyunAccessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
config.aliyunAccessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
//如果使用阿里云KMS簽名,請更換為您的KMS服務密鑰ID。
config.kmsKeyId = "4358f298-8e30-4849-9791-****";
//如果使用阿里云KMS簽名,請更換為您的KMS服務密鑰版本ID。
config.kmsKeyVersionId = "e71daa69-c321-4014-b0c4-****";
//如果使用阿里云KMS簽名,需要更換為您的KMS服務地址。
//KMS服務地址列表詳情,請參考:
//http://bestwisewords.com/document_detail/69006.html
config.kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com";
return config;
}
}
代碼示例:公鑰證書方式
使用公鑰證書方式時,EasySDK的使用方式和上述示例類似,區別主要在于配置了商戶應用和支付寶平臺的公鑰證書。更多信息,請參見阿里云KMS Github代碼樣例庫。