常见问题

Q:RSA签名涉及到的商户角色有哪些?

A:通常由支付宝账户管理者登录开放平台上传商户应用公钥,并记录appid及支付宝公钥信息。

技术同学得到1).appid,2).商户私钥,3).支付宝公钥,放到代码里去签名和验签。

Q: 什么是RSA算法?

A:RSA签名算法是一种非对称算法,RSA密钥包括公钥和私钥两部分,公钥是公开信息,私钥是保密信息。在开放平台,开发者的私钥由开发者自己保存;开发者的公钥可对外公开。私钥用于签名,公钥用于验签。开发者保存自己的私钥,并对发给支付宝的信息进行签名,支付宝通过使用开发者的公钥进行验签;(支付宝端类似),通过这种方式保证信息传输的完整性以及发送者身份的真实性。

Q:和支付宝交换公钥是什么意思?

A:开发者私钥由开发者自行保管,把对应公钥提供给支付宝。相应的,支付宝提供自己的公钥给开发者,这称为交换公钥。

开发者使用开发者私钥对请求内容签名,支付宝收到请求后,会使用开发者公钥进行验签,验签通过证明信息来源可靠并且未篡改。

支付宝发送给开发者的数据中,支付宝也会使用自己的私钥进行签名。商户收到后,使用支付宝公钥验签,验签通过证明是支付宝发送的消息,并且未篡改。

Q:开放平台 openapi 网关接口和支付宝mapi网关接口签名处理上有何区别?

A:开放平台接口网关地址是 open.alipay.com,mapi网关地址是mapi.alipay.com。

签名专区描述的内容是针对openapi网关接口的签名和验签方法。如果是mapi网关接口,签名规则有所区别,具体请参考对应接口文档(历史接口)中的签名描述。

Q:开放平台支持的“普通公钥”、“公钥证书”两种签名方式有什么区别?

A:在报文签名场景下,报文接受方使用发送方的公钥进行报文验签,该功能两种签名方式都可以实现。而证书签名方式的优势在于引入了CA机构对公钥持有者进行身份识别,保证该证书所属实体的真实性,以实现报文的抗抵赖。

Q:原使用“普通公钥”签名方式的应用如何升级“公钥证书”签名方式?

A:开发者登陆开放平台,在应用“加签方式”设置页面,选择“公钥证书”方式,再在该页面中通过“上传CSR文件在线生成证书”或“上传已申请证书”两种方式设置应用的公钥证书,具体操作详见签名专区教程

注意:对于从“公钥”变更到“公钥证书”签名方式的应用,在变更一周内允许开发者撤销证书回退到“公钥”模式;变更一周后不允许再回退到原模式。开发者调用支付宝网关的代码也需要升级,否则变更一周后原来的“公钥”模式接入会被支付宝网关拦截而无法成功调用。

Q:老应用公钥证书如何更换成新公钥证书?

A:开发者登陆开放平台,在应用“加签方式”设置页面,选择“公钥证书”方式,再在该页面中通过“上传CSR文件在线生成证书”或“上传已申请证书”两种方式设置应用新应用公钥证书,具体操作详见签名专区教程
注意:
上传新应用公钥证书后,开放平台将为老应用公钥证书保留7天有效期(若在这7天内老证书到期,以老证书自身过期时间点为准),超过7天后老证书将不可用。开发者务必在更新证书后7天时间内,更换接入开放平台网关代码中的应用公钥证书,否则7天后开放平台网关将验签失败。

Q:使用公钥证书签名方式下, 请求参数中需要携带应用公钥证书SN(app_cert_sn)、支付宝根证书SN(alipay_root_cert_sn),这里的SN是指什么?

**
A:这里的SN是指基于开放平台提供的计算规则,动态计算出来的公钥证书序列号,与X.509证书中内置的序列号(serialNumber)不同。具体的计算规则如下:

  1. 解析X.509证书文件,获取证书签发机构名称(name)以及证书内置序列号(serialNumber)。
  2. 将name与serialNumber拼接成字符串,再对该字符串做MD5计算。

可以参考开放平台SDK源码中的AlipaySignature.getCertSN方法实现

/**
  * 获取证书序列号
  * @param certPath X.509证书文件路径
  * @return 返回证书序列号
  * @throws AlipayApiException
  */
public static String getCertSN(String certPath)

看到这里很多同学可能会有疑问,为什么不直接使用证书文件中内置的序列号?原因是开放平台支持开发者上传自己找第三方权威CA签发的证书,而证书文件中内置序列号只能保证同一家签发机构签发的证书不重复。

Q:使用公钥证书签名方式下,为什么请求参数中必须应用公钥证书SN(app_cert_sn)?

A:当前开放平台支持两种签名模式:普通公钥模式、公钥证书模式,开放平台网关会根据请求参数中是否存在应用公钥证书SN(app_cert_sn)来判断,当前请求是使用普通公钥模式还是公钥证书模式。

若开发者选择了公钥证书签名模式,上传了应用公钥证书,并使用该公钥对应的私钥加签,但请求参数中未携带应用公钥证书SN。开放平台网关收到请求后,会认为该请求使用普通公钥签名模式,将导致网关验签失败。

另外,开发者也一定要确保自己用来加签的私钥、请求参数中应用公钥证书SN的值、上传到开放平台的应用公钥证书必须是匹配的,否则网关会验签失败。

Q:使用公钥证书签名方式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书SN(alipay_cert_sn)?

**
A:开发者上传自己的应用公钥证书后,开放平台会为开发者应用自动签发支付宝公钥证书供开发者下载,用来对开放平台网关响应报文做验签。

但是支付宝公钥证书可能因证书到期或者变更CA签发机构等原因,可能会重新签发证书。在重新签发前,开放平台会在门户上提前提醒开发者支付宝应用公钥证书变更时间。

但为避免开发者因未能及时感知支付宝公钥证书变更而导致验签失败,开放平台提供了一种支付宝公钥证书无感知升级机制,具体流程如下:
1)开放平台网关在响应报文中会多返回支付宝公钥证书SN
2)开放平台网关提供根据SN下载对应支付宝公钥证书的API接口
3)开发者在验签过程中,先比较本地使用的支付宝公钥证书SN与开放平台网关响应中SN是否一致。若不一致,可调用支付宝公钥证书下载接口下载对应SN的支付宝公钥证书。
4)对下载的支付宝公钥证书执行证书链校验,若校验通过,则用该证书验签。

基于该机制可实现支付宝公钥证书变更时开发者无感知,当前开放平台提供的SDK已基于该机制实现对应功能。若开发者未通过SDK接入,须自行实现该功能。

Q:使用公钥证书签名方式下,为什么请求参数中必须设置支付宝根证书SN(alipay_root_cert_sn)?

A:从上面的问题“使用公钥证书签名模式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书SN”了解到,对动态下载的支付宝公钥证书,我们需要执行证书链校验,在校验过程中,需要使用到支付宝根证书,也就是从开放平台下载的根证书。

但这里有个问题,上面我们提到了支付宝公钥证书变更的原因中,就有可能是因变更根CA(比如根CA到期或者当前的CA机构存在风险)。开放平台变更根CA会提前半年来通知商户及时更新,但不排除有的商户没有及时感知到变更导致变更根CA后,商户验签失败。

为降低该风险,开放平台强制要求使用证书签名模式的商户同时携带当前使用的支付宝根证书SN,开放平台将基于该数据来分析统计未及时更新支付宝根证书的商户。

Q:当前开放平台支持哪些权威CA签发的证书

A:当前开放平台支持根CA列表,如下

机构名称 电子认证服务机构简称 证书主题名称 密钥算法 证书生效时间(GMT) 证书失效时间(GMT)
浙江蚂蚁小微金融服务集团股份有限公司 蚂蚁CA Ant Financial Certification Authority R1 RSA4096 2018/3/21 13:48 2038/2/28 13:48
中金金融认证中心有限公司 CFCA CFCA ACS CA RSA4096 2015/9/23 3:24 2035/9/28 3:24
北京天威诚信电子商务服务有限公司 天威诚信 iTrusChina Class 3 Root CA - G3 RSA2048 2013/4/18 9:36 2033/4/18 9:36
北京天威诚信电子商务服务有限公司 天威诚信 iTrusChina Class 2 Root CA - G3 RSA2048 2013/4/18 9:39 2033/4/18 9:39
国家根 ROOTCA ROOTCA SM2 2012/7/14 3:11 2042/7/7 3:11
onlineServer