平台证书
更新时间:2023.09.13微信支付平台证书是由 证书颁发机构 (opens new window) 颁发,由微信支付 申请和管理的数字证书,它包含了微信支付平台的身份标识和公钥信息。
# 为什么要使用平台证书
金融类互联网应用的消息真实性和完整性至关重要。商户系统在收到微信支付的应答或回调通知时,需要验证消息的真实性(确保来自微信支付)和完整性(未被第三方篡改)。
微信支付对 HTTP 关键信息提供数字签名。商户通过使用微信支付平台证书的公钥验证签名,可以确认收到的消息确实来自微信支付,而非其他恶意方伪造。这样,商户可以安心处理交易请求,避免因信任错误来源而导致的潜在风险。
# 平台证书的有效期
微信支付平台证书的有效期为5年。证书过期后,许多编程语言的密码库将不再视其为有效,导致商户可能无法使用过期证书验证微信支付签名。为确保顺利过渡,微信支付会在当前证书过期前,为商户分配新的微信支付平台证书,并逐步采用新证书生成签名。你可以将平台证书切换成微信公钥,参考平台证书切换微信支付公钥指引
已获取平台证书的商户开发者可以使用 openssl
命令行工具查看证书有效期。以下示例中的证书有效期至2024年8月17日。
1❯ openssl x509 -in your_wechatpay_cert.pem -noout -enddate2notAfter=Aug 17 06:52:04 2024 GMT
商户应重视微信支付平台证书的5年有效期,在平台证书过期前及时获取并部署新证书。只有正确处理微信支付平台证书,商户才能实现支付功能的连续和稳定,为用户提供优质支付体验。
警告
若商户未能及时更新证书,可能导致验签失败,进而影响正常交易处理。这将导致商户运营中断,影响收入和客户满意度。
# 获取平台证书
调用 下载平台证书 接口,商户系统可以获取商户当前可用的微信支付平台证书。
1{2 "data": [3 {4 "serial_no": "5157F09EFDC096DE15EBE81A47057A7232F1B8E1",5 "effective_time ": "2018-06-08T10:34:56+08:00",6 "expire_time ": "2018-12-08T10:34:56+08:00",7 "encrypt_certificate": {8 "algorithm": "AEAD_AES_256_GCM",9 "nonce": "61f9c719728a",10 "associated_data": "certificate",11 "ciphertext": "sRvt… "12 }13 },14 {15 // 商户有多张证书,以下省略16 }17 ]18}
为确保证书传输的完整性和真实性,微信支付采用了 AEAD (opens new window)(Authenticated Encryption with Associated Data)的加密,保护商户获取的平台证书免受“中间人”篡改。请查看 如何解密证书,从每个证书对象的 encrypt_certificate
中验证并解密出所有的微信支付平台证书。
商户开发者也可以使用微信支付提供的 平台证书下载工具 获取平台证书。
警告
每个商户的平台证书不止一个。在更换平台证书期间,商户获取的平台证书列表中一定会包含多个平台证书。每个证书都可能被使用。因此,商户应把下载得到的所有证书保存并部署至商户系统中。
# 使用平台证书
微信支付平台证书主要用于两种场景:
- 商户验证 API 应答和回调通知签名
- 商户加密 API 请求中的敏感信息
# 验证签名
验证签名对保证消息安全至关重要。若商户未能正确验证微信支付消息签名,可能会接收并处理恶意方伪造的消息,导致资金损失或客户投诉。
请查看我们的指引,了解如何使用微信支付平台证书 验证签名 (opens new window)。
# 敏感信息加密
为保证通信过程中敏感信息字段(如用户住址、银行卡号、手机号码等)的机密性,微信支付要求商户加密传输 API 请求中的敏感信息字段。这样,只有持有私钥的微信支付才能解密商户的敏感信息,避免中间人获取敏感信息。
商户开发者应使用微信支付平台证书中的公钥对请求中的敏感信息进行加密。这样,只有拥有私钥的微信支付方可对密文解密,确保敏感信息的机密性。
请查看我们的指引,了解 如何加解密敏感信息。
提示
若有多个证书,建议使用最新(过期时间最晚)证书公钥,避免过期后未能及时更换,导致微信支付解密失败。
# 新旧平台证书更换机制
微信支付会在当前证书过期前,为商户分配新的微信支付平台证书。为了帮助商户平稳、高效地更换新旧平台证书,微信支付为商户提供了微信支付 平台证书更换工具。
证书更换过程将包括以下几个步骤:
- 旧证书过期前210天,微信支付会为商户生成新证书。此时,下载平台证书 接口仍然只返回旧证书。若商户系统已支持获取多证书,可登录微信支付商户平台【账户中心—API安全—平台证书-下载证书接口管理】主动开启返回新证书。
- 旧证书过期前180天,下载平台证书接口开始同时返回新证书和旧证书。若商户系统尚未支持获取多证书,可登录微信支付商户平台【账户中心—API安全—平台证书-下载证书接口管理】推迟新证书返回的日期。
- 下载平台证书接口返回新证书后,商户应确认新老证书都已部署至生产环境。若已部署完毕,商户可登录微信支付商户平台【账户中心—API安全—平台证书】,开启新旧证书灰度更换。开启灰度更换后,微信支付将按照灰度比例,使用新证书对应答和回调消息签名。商户系统需要根据证书序列号,使用对应的证书验证微信支付的消息签名。
- 若旧证书过期前90天,商户仍未主动开启灰度更换,微信支付将自动开启灰度更换,以避免证书直接过期对商户造成更大影响。
注意
请确保你的系统支持平台证书下载接口同时返回新证书、旧证书,否则可能系统异常
请确保在旧证书过期前90天,你已经将新、旧证书都部署至生产环境,并支持多证书验签,否则可能系统异常
整个过程,商户的超级管理员和安全联系人都会收到微信支付商户平台站内信、商家助手公众号、服务商助手公众号和短信的通知,以便商户了解更换的进度。
若以上任意时刻,商户系统出现异常,商户可在微信支付商户平台【账户中心—API安全—平台证书】终止更换。商户应修复异常,并在确认部署证书正确后,再次启动灰度更换。
详细的操作指引请查看 平台证书更换操作指引
# 最佳实践
如果你使用 Java 或 Go 语言,推荐使用微信支付的服务端 SDK。使用 SDK,无需自行获取微信支付平台证书。SDK 提供了对应的配置类,可自动获取和更新平台证书,并自动验证签名。
如果你自行实现平台证书的获取、使用、部署和更新,请遵循以下最佳实践,确保正确使用,提高验证签名的可用性和安全性。
# 部署平台证书
在证书更新阶段,微信支付会同时使用新旧证书。你应将它们一同部署到生产环境中。商户应根据证书序列号选择对应证书,以顺利验证签名。在部署证书时,推荐将证书的元数据一并存储,以便于快速定位查找证书和定位问题。例如,将证书的文件名命名为 {商户号}_{过期时间}_{证书序列号}.pem
。
建议不要将平台证书打包到二进制文件中,而是将其作为系统运行时所需数据存储在数据库中。由于证书不可变,可在商户应用程序中缓存证书对象,提高性能和可用性。
当微信支付平台证书过期或不再出现在平台证书列表中时,商户系统应及时移除过期证书或将其标记为不可用,避免安全隐患。
# 及时更新平台证书
商户系统应及时更新微信支付平台证书。推荐以下两种更新方式:
- 定时更新:定时获取微信支付平台证书。更新后,自动将证书部署到生产环境中。
- 惰性加载:当商户应用程序中无证书序列号对应证书时,调用API获取对应平台证书,并缓存以供验签使用。惰性加载实现简单,但会增加处理耗时和重复下载,仅建议请求量较少、对用户访问延时要求不高的商户选用。
对于大多数商户,建议采用定时更新机制,因为它可以确保商户系统始终使用最新的证书进行验证签名,同时避免在验签过程中产生额外延时。定时更新机制适用于大多数场景,可以提高用户体验。
无论采用何种方法,商户系统应自动化获取、更新并部署平台证书,如设置定时(每日)任务。这可降低证书更新时人为因素给商户系统带来的风险。
若系统未自动定时更新微信支付平台证书,则需暂停服务以手动更新。可使用微信支付提供的平台证书更换工具 (opens new window)协助完成。
# 中心式的证书服务
对于拥有多个应用服务的商户,每个应用服务需使用微信支付平台证书以验证签名或加密。我们建议采用中心式证书服务提供签名验证,实现证书的集中管理和一致性。中心式证书服务具有以下优点:
- 便于维护和监控:证书的获取、更新和部署集中在一个服务中,便于维护和监控。
- 逻辑一致:所有应用服务都使用相同的验证逻辑,降低出错概率。
- 易于扩展:当需要添加新的应用服务时,无需单独部署证书,直接使用中心式证书服务即可。
然而,若中心式证书服务出现故障,可能导致所有应用服务无法验证签名。因此,在实施此方式时,请确保中心式证书服务具备高可用性和足够的系统容量。
# 总结
- 验证签名:务必验证微信支付的应答和通知回调的消息签名。
- 自动化更新证书:定期(如每日)自动获取、更新并部署微信支付平台证书,以确保商户系统始终使用最新的证书进行验证签名。更新证书的频率不需过于频繁,建议以24小时为宜。
- 多证书支持:在微信支付更换平台证书期间,商户系统应同时支持新旧证书,并根据证书序列号选择相应证书进行验证签名。
- 合理存储证书:建议不要将平台证书打包到二进制文件中,而是将其作为系统运行时所需数据存储在数据库中。同时,确保证书存储位置的安全性,防止未经授权的访问。
- 证书缓存:由于证书不可变,可在商户应用程序中缓存证书对象,提高性能和可用性。
- 及时移除过期证书:当微信支付平台证书过期或不再出现在平台证书列表中时,商户系统应及时移除过期证书或将其标记为不可用,避免安全隐患。
- 监控告警:建立证书更新、验证签名和敏感信息加密等关键流程的监控告警机制,以便在出现异常时及时发现并解决问题。
- 日志审计:记录平台证书相关操作和事件的日志,以便在出现问题时进行调查和排查。
- 安全培训与意识:培训开发人员和运维人员,提高他们使用微信支付平台证书的安全意识,确保他们能够遵循最佳实践和安全策略。
- 业务连续性计划:制定平台证书相关的业务连续性计划,以应对证书过期后的意外和灾难情况,定期识别并修复潜在的技术债务和风险,确保商户系统的稳定运行。