公钥、私钥、证书、签名的区别
1,商户API证书
说明:
商户自己申请可以获取的,通过商户平台跟着指引下载证书,包含:商户的商户号、公司名称、公钥信息。
是微信提供的二进制文件,商户发起与微信支付后台服务器请求的时候,是微信支付后台识别商户真实身份的评剧。
2,商户私钥
说明:
在申请的商户API证书里面存放着的,私钥存在apiclient_key.pem中。私钥也可以通过工具从商户的P12证书中导出。
使用场景:
商户私钥:生成签名,使用商户私钥对签名串进行SHA256 with RSA签名、返回敏感信息进行解密
商户公钥:微信支付系统使用商户公钥进行签名验证、对下行商户的信息进行加密
3,APIv3密钥
说明:
在商户平台自己设置的,微信支付在回调通知和平台证书下载接口中,对关键信息进行了AES-256-GCM加密。与API 密钥是隔离的,不影响使用。
使用场景:
对微信平台证书解密(通过API文档下载平台证书时,微信返回的证书是密文,需要解密)、回调信息解密等等。
4,平台证书
说明:
不是商户自己申请的,是微信平台申请的,我们可以通过API接口下载,也可以通过工具下载,第一次下载建议使用工具下载。包含:微信支付平台的证书序列号、公钥信息等等。
使用场景:
获取平台公钥、平台序列号
5,平台公钥
说明:
在微信平台证书中获取,是微信的公钥。
使用场景:
商户对微信下行的信息验证签名、上送时对敏感信息加密
6,签名
说明:
商户使用自身的私钥对传输文本的摘要进行签名,得到的密文就是这次传输过程中的签名。
商户后台与微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份的合法性。签名的算法有微信支付指定并公开,常用的签名方式有:MD5、SHA1、SHA256、HMAC、RSA等等。保证请求的真实性和完整性。
7,摘要
说明:
对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得
8,请求签名
说明:
商户需要对请求进行签名,即商户使用自身的私钥对API URL、消息体等关键数据的组合进行SHA-256 with RSA签名,请求的签名信息通过HTTP头Authorization传递,微信支付系统收到请求后会进行签名的验证。请求没有携带签名或者微信支付系统签名验证不通过的,都不会被执行,并返回401 Unauthorized
。
请求签名是商户发送给微信的,是用商户私钥对请求内容加密的,微信接收到请求签名之后需要使用商户公钥进行验证签名。
9,验证签名
说明:
数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。
10,应答签名
说明:
对于签名验证成功的请求,微信支付API v3会使用微信支付的平台私钥对**应答(response的内容)**进行签名。签名的信息包含在HTTP头部中,此时这次应答携带了签名,商户需要使用平台公钥进行验签。没有携带签名的成功应答(状态码2xx),应认为是伪造或篡改的应答。
应答签名是微信发送给商户的,所以是用平台私钥对应答内容加密的,商户收到应答签名之后同样需要使用平台证书中的公钥进行签名验证。
11,回调通知签名
说明:
当调用商户的接口时,微信支付会使用微信支付的平台私钥对回调请求进行签名。签名的方法同应答签名的方式一致,商户必须使用微信支付公钥验证回调的签名。通知必须要验证微信支付签名,避免被恶意攻击。
回调/通知签名是微信发送给商户的,商户收到之后也需要使用平台证书中的公钥进行签名验证。
注意:
- 商户签名使用 商户私钥 ,证书序列号包含在请求HTTP头部的
Authorization
的serial_no
- 微信支付签名使用微信支付平台私钥,证书序列号包含在应答HTTP头部的
Wechatpay-Serial
- 商户上送敏感信息时使用微信支付平台公钥加密,证书序列号包含在请求HTTP头部的
Wechatpay-Serial