关键概念

更新时间:2023.09.15

# 关键概念

API安全机制简介中我们介绍了商户请求微信支付、微信支付回调商户时保障通信安全的机制,里面包含了:商户API证书、平台证书、APIv3密钥等关键概念,接下来我们详细介绍一下这些关键概念,以便辅助商户理解为什么我们需要一个这样看起来十分繁琐的安全机制。

# 证书

# 证书是什么?

数字签名定义了两种运算: 签名和验签。使用数字签名时,需要通信的双方都要事先生成公钥、私钥,并且完成交换。

但是由于公钥本身并不含有拥有者的身份信息,使用时无法确认它是真实有效的。

所以需要证书认证机构(简称 CA)在核实公钥拥有者的信息后,将公钥拥有者的身份信息(如商户号、公司名称等),公钥、签发者信息、有效期以及扩展信息等进行签名,制作成“证书”。

简单理解就是:证书包含公钥,同时还包含公钥所有者、签发者、有效期等关键信息,使用者可以验证其真实性。

# 为什么我们需要它?

单从加签、验签的过程来看,确实可以不需要证书,只要交换好公私钥就行了。不过前文已经提到,公钥的劣势在于无法核实其真实性,那么就容易遭到中间人攻击(man-in-the-middle attack)。

示意图如下: 图片

  1. Alice将公钥:PK_A 传送给Bob。
  2. Mallory截取了这个密钥并将自己的公开密钥:PK_M 传送给Bob,并声称这是Alice的公钥。
  3. Bob用“Alice”的公开密钥(实际上是Mallory的公开密钥)加密的消息传送给Alice时。
  4. Mallory截取它。并用他的私人密钥解密消息。
  5. Mallory篡改了明文,再用Alice的公开密钥:PK_A 重新加密,并将加密后的消息传送给Alice。
  6. Alice使用自己的私钥对消息进行解密,得到明文。(实际已经被Mallory篡改)

这种攻击是完全可行的,因为Alice和Bob无法验证他们的互相交谈。如果Mallory没有导致任何值得注意的网络延迟,两人就没有办法知道有人在他们中间阅读传输的信息。

有了证书之后,Alice和Bob能够验证对方的公钥所有者、有效期,那么Mallory便无法用自己的公钥进行伪装,便无法进行中间人攻击。

商户和微信支付便是例子里的Alice和Bob,Mallory代指所有可能的恶意攻击者。

# 商户API证书

商户API证书,是指由商户申请的,用来证实商户身份的证书。API证书由证书授权机构Certificate Authority(简称CA)颁发。证书中包含商户的商户号、公司名称、公钥等信息。

商户可以自行生成证书请求串,也可以下载微信支付证书工具生成证书请求串。提交证书请求串至商户平台后,即可获得商户 API 证书文件。

详情见:什么是 API 证书?如何获取 API 证书? (opens new window)

# 商户API私钥

商户申请商户 API 证书时,证书工具会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。私钥也可通过工具从商户的 p12 证书中导出。请妥善保管好商户私钥文件。

我们再复习一下商户API证书和商户API私钥的用途:

  1. 商户请求微信支付时,使用商户API私钥对请求签名,微信支付使用商户API证书公钥对收到的请求进行验签,以验证商户身份。
  2. 微信支付对商户请求做出应答时,如有敏感字段,使用商户API证书公钥进行加密,商户收到应答后,使用商户API私钥进行解密。

# 微信支付平台证书

微信支付平台证书是由 微信支付 负责申请和管理的,该证书包含了微信支付平台的身份标识和公钥信息。

每位商户都会分配到一个或多个微信支付平台证书。在处理接口响应或回调通知时,商户需要根据证书序列号选择对应的平台证书,并使用其中的公钥进行签名验证。

商户可通过调用 获取平台证书列表 接口,获取当前可用的微信支付平台证书。

# 微信支付平台私钥

微信支付平台证书公钥所对应的私钥由微信支付所有,在微信支付保管。

我们再复习一下微信支付平台证书和微信支付平台私钥的用途:

  1. 商户请求微信支付时,如有敏感字段,使用微信支付平台证书公钥进行加密,微信支付使用平台私钥进行解密。
  2. 微信支付对商户请求做出应答时,使用微信支付平台私钥对应答签名,商户收到应答后,使用微信支付平台证书公钥进行验签,以验证微信支付身份。
  3. 微信支付回调商户时,使用微信支付平台私钥对请求签名,商户收到请求后,使用微信支付平台公钥进行验签,以验证微信支付身份。

# API v3密钥

为了保证安全性,微信支付在 回调商户 和 平台证书下载接口 中,对关键信息进行了AES-256-GCM加密。API v3密钥是加密时使用的对称密钥。详见:API v3密钥

注意回调商户和平台证书下载接口的加密方式略有不同:

  1. 在回调商户的场景,微信支付使用API v3密钥对整个请求进行加密。
  2. 在下载平台证书场景,微信支付使用API v3密钥对应答中的单个平台证书内容进行加密,而非对整个应答进行加密。
反馈
咨询
目录