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