# 關(guān)鍵概念
在API安全機(jī)制簡(jiǎn)介中我們介紹了商戶請(qǐng)求微信支付、微信支付回調(diào)商戶時(shí)保障通信安全的機(jī)制,里面包含了:商戶API證書、平臺(tái)證書、APIv3密鑰等關(guān)鍵概念,接下來我們?cè)敿?xì)介紹一下這些關(guān)鍵概念,以便輔助商戶理解為什么我們需要一個(gè)這樣看起來十分繁瑣的安全機(jī)制。
# 證書
# 證書是什么?
數(shù)字簽名定義了兩種運(yùn)算: 簽名和驗(yàn)簽。使用數(shù)字簽名時(shí),需要通信的雙方都要事先生成公鑰、私鑰,并且完成交換。
但是由于公鑰本身并不含有擁有者的身份信息,使用時(shí)無法確認(rèn)它是真實(shí)有效的。
所以需要證書認(rèn)證機(jī)構(gòu)(簡(jiǎn)稱 CA)在核實(shí)公鑰擁有者的信息后,將公鑰擁有者的身份信息(如商戶號(hào)、公司名稱等),公鑰、簽發(fā)者信息、有效期以及擴(kuò)展信息等進(jìn)行簽名,制作成“證書”。
簡(jiǎn)單理解就是:證書包含公鑰,同時(shí)還包含公鑰所有者、簽發(fā)者、有效期等關(guān)鍵信息,使用者可以驗(yàn)證其真實(shí)性。
# 為什么我們需要它?
單從加簽、驗(yàn)簽的過程來看,確實(shí)可以不需要證書,只要交換好公私鑰就行了。不過前文已經(jīng)提到,公鑰的劣勢(shì)在于無法核實(shí)其真實(shí)性,那么就容易遭到中間人攻擊(man-in-the-middle attack)。
示意圖如下:
- Alice將公鑰:PK_A 傳送給Bob。
- Mallory截取了這個(gè)密鑰并將自己的公開密鑰:PK_M 傳送給Bob,并聲稱這是Alice的公鑰。
- Bob用“Alice”的公開密鑰(實(shí)際上是Mallory的公開密鑰)加密的消息傳送給Alice時(shí)。
- Mallory截取它。并用他的私人密鑰解密消息。
- Mallory篡改了明文,再用Alice的公開密鑰:PK_A 重新加密,并將加密后的消息傳送給Alice。
- Alice使用自己的私鑰對(duì)消息進(jìn)行解密,得到明文。(實(shí)際已經(jīng)被Mallory篡改)
這種攻擊是完全可行的,因?yàn)锳lice和Bob無法驗(yàn)證他們的互相交談。如果Mallory沒有導(dǎo)致任何值得注意的網(wǎng)絡(luò)延遲,兩人就沒有辦法知道有人在他們中間閱讀傳輸?shù)男畔ⅰ?/p>
有了證書之后,Alice和Bob能夠驗(yàn)證對(duì)方的公鑰所有者、有效期,那么Mallory便無法用自己的公鑰進(jìn)行偽裝,便無法進(jìn)行中間人攻擊。
商戶和微信支付便是例子里的Alice和Bob,Mallory代指所有可能的惡意攻擊者。
# 商戶API證書
商戶API證書,是指由商戶申請(qǐng)的,用來證實(shí)商戶身份的證書。API證書由證書授權(quán)機(jī)構(gòu)Certificate Authority(簡(jiǎn)稱CA)頒發(fā)。證書中包含商戶的商戶號(hào)、公司名稱、公鑰等信息。
商戶可以自行生成證書請(qǐng)求串,也可以下載微信支付證書工具生成證書請(qǐng)求串。提交證書請(qǐng)求串至商戶平臺(tái)后,即可獲得商戶 API 證書文件。
詳情見:什么是 API 證書?如何獲取 API 證書? (opens new window)
# 商戶API私鑰
商戶申請(qǐng)商戶 API 證書時(shí),證書工具會(huì)生成商戶私鑰,并保存在本地證書文件夾的文件 apiclient_key.pem 中。私鑰也可通過工具從商戶的 p12 證書中導(dǎo)出。請(qǐng)妥善保管好商戶私鑰文件。
我們?cè)購(gòu)?fù)習(xí)一下商戶API證書和商戶API私鑰的用途:
- 商戶請(qǐng)求微信支付時(shí),使用商戶API私鑰對(duì)請(qǐng)求簽名,微信支付使用商戶API證書公鑰對(duì)收到的請(qǐng)求進(jìn)行驗(yàn)簽,以驗(yàn)證商戶身份。
- 微信支付對(duì)商戶請(qǐng)求做出應(yīng)答時(shí),如有敏感字段,使用商戶API證書公鑰進(jìn)行加密,商戶收到應(yīng)答后,使用商戶API私鑰進(jìn)行解密。
# 微信支付平臺(tái)證書
微信支付平臺(tái)證書是由 微信支付 負(fù)責(zé)申請(qǐng)和管理的,該證書包含了微信支付平臺(tái)的身份標(biāo)識(shí)和公鑰信息。
每位商戶都會(huì)分配到一個(gè)或多個(gè)微信支付平臺(tái)證書。在處理接口響應(yīng)或回調(diào)通知時(shí),商戶需要根據(jù)證書序列號(hào)選擇對(duì)應(yīng)的平臺(tái)證書,并使用其中的公鑰進(jìn)行簽名驗(yàn)證。
商戶可通過調(diào)用 獲取平臺(tái)證書列表 接口,獲取當(dāng)前可用的微信支付平臺(tái)證書。
# 微信支付平臺(tái)私鑰
微信支付平臺(tái)證書公鑰所對(duì)應(yīng)的私鑰由微信支付所有,在微信支付保管。
我們?cè)購(gòu)?fù)習(xí)一下微信支付平臺(tái)證書和微信支付平臺(tái)私鑰的用途:
- 商戶請(qǐng)求微信支付時(shí),如有敏感字段,使用微信支付平臺(tái)證書公鑰進(jìn)行加密,微信支付使用平臺(tái)私鑰進(jìn)行解密。
- 微信支付對(duì)商戶請(qǐng)求做出應(yīng)答時(shí),使用微信支付平臺(tái)私鑰對(duì)應(yīng)答簽名,商戶收到應(yīng)答后,使用微信支付平臺(tái)證書公鑰進(jìn)行驗(yàn)簽,以驗(yàn)證微信支付身份。
- 微信支付回調(diào)商戶時(shí),使用微信支付平臺(tái)私鑰對(duì)請(qǐng)求簽名,商戶收到請(qǐng)求后,使用微信支付平臺(tái)公鑰進(jìn)行驗(yàn)簽,以驗(yàn)證微信支付身份。
# API v3密鑰
為了保證安全性,微信支付在 回調(diào)商戶 和 平臺(tái)證書下載接口 中,對(duì)關(guān)鍵信息進(jìn)行了AES-256-GCM加密。API v3密鑰是加密時(shí)使用的對(duì)稱密鑰。詳見:API v3密鑰。
注意回調(diào)商戶和平臺(tái)證書下載接口的加密方式略有不同:
- 在回調(diào)商戶的場(chǎng)景,微信支付使用API v3密鑰對(duì)整個(gè)請(qǐng)求進(jìn)行加密。
- 在下載平臺(tái)證書場(chǎng)景,微信支付使用API v3密鑰對(duì)應(yīng)答中的單個(gè)平臺(tái)證書內(nèi)容進(jìn)行加密,而非對(duì)整個(gè)應(yīng)答進(jìn)行加密。