公钥、私钥、证书、签名的区别

公钥、私钥、证书、签名的区别

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头部的 Authorizationserial_no
  • 微信支付签名使用微信支付平台私钥,证书序列号包含在应答HTTP头部的Wechatpay-Serial
  • 商户上送敏感信息时使用微信支付平台公钥加密,证书序列号包含在请求HTTP头部的Wechatpay-Serial
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用 OpenSSL 库生成 p12 格式证书的 C++ 代码示例: ``` #include <openssl/pem.h> #include <openssl/x509.h> #include <openssl/pkcs12.h> int main() { // 生成RSA私钥 EVP_PKEY* pkey = EVP_PKEY_new(); RSA* rsa = RSA_new(); BIGNUM* bn = BN_new(); BN_set_word(bn, RSA_F4); RSA_generate_key_ex(rsa, 2048, bn, NULL); EVP_PKEY_assign_RSA(pkey, rsa); // 生成证书请求 X509_REQ* req = X509_REQ_new(); X509_REQ_set_pubkey(req, pkey); X509_NAME* name = X509_NAME_new(); X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (const unsigned char*)"CN", -1, -1, 0); X509_REQ_set_subject_name(req, name); // 生成自签名证书 X509* x509 = X509_new(); X509_set_version(x509, 2); ASN1_INTEGER_set(X509_get_serialNumber(x509), 0); X509_gmtime_adj(X509_get_notBefore(x509), 0); X509_gmtime_adj(X509_get_notAfter(x509), 31536000L); X509_set_pubkey(x509, pkey); X509_set_subject_name(x509, name); X509_set_issuer_name(x509, name); X509_sign(x509, pkey, EVP_sha256()); // 生成p12格式证书 PKCS12* p12 = PKCS12_create(NULL, "p12_password", pkey, x509, NULL, 0, 0, 0, 0, 0); FILE* fp = fopen("cert.p12", "wb"); i2d_PKCS12_fp(fp, p12); fclose(fp); PKCS12_free(p12); // 释放资源 X509_REQ_free(req); X509_free(x509); EVP_PKEY_free(pkey); BN_free(bn); X509_NAME_free(name); return 0; } ``` 以上代码中,生成 RSA 私钥的过程使用 OpenSSL 库提供的 RSA_generate_key_ex 函数,生成证书请求和证书的过程中使用 X509_REQ_new 和 X509_new 函数创建 X509_REQ 和 X509 对象,使用 EVP_PKEY_assign_RSA 和 X509_set_pubkey 函数设置公钥,使用 X509_set_subject_name 函数设置证书主题,使用 X509_gmtime_adj 函数设置证书有效期,使用 X509_sign 函数自签名证书。最后,使用 PKCS12_create 函数生成 p12 格式证书,并使用 i2d_PKCS12_fp 函数将其写入文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦梦~~

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值