美文网首页
python获取支付宝公钥证书SN

python获取支付宝公钥证书SN

作者: 悠哉的生活 | 来源:发表于2020-08-15 15:39 被阅读0次

最近支付宝给个人账号转账(接口alipay.fund.trans.toaccount.transfer)发现每天额度只有1万,超过了就全提示超过额度打款失败,问客服说是需要升级到新接口才能恢复额度。

新接口:alipay.fund.trans.uni.transfer(单笔转账接口)

试着改接口,改参数提示isv.app-cert-not-exist,发现之前的公钥验证需要改成公钥证书,改了之后只有7天时间老的公钥会失效,需要全部升级成公钥证书。

1. 如何生成公钥证书

在支付宝开放平台接口加密方式修改为公钥证书,然后下载支付宝公钥(如下图),文件名分别为:alipayRootCert.crt,alipayCertPublicKey_RSA2.crt,appCertPublicKey_(appid).crt

image

2. 自行生成签名

说明: 公钥证书方式下,开发者发送给开放平台网关请求参数中,需携带 应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn),若不携带这两个参数,网关会拒绝请求(具体问题请参考 常见问题 Q9-12)。SN 值是通过解析 X.509 证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算 MD5 值获取,可参考开放平台 SDK 源码中 AlipaySignature.getCertSN 实现 app_cert_sn 的提取。

2.1 获取alipay_root_cert_sn

以为获取公钥证书SN很简单,试了N回都是isv.invalid-alipay-root-cert-sn,最后发现坑不少啊。

alipayRootCert里其实有4个证书,需要手动拆成4个文件,然后读取需要信息,其中有两个的dotted_string是1.2.840.113549.1.1.5才是我们需要的证书,最后计算出md5,以下划线_拼接起来就是我们需要的alipay_root_cert_sn


pip install pyOpenSSL


>>> with open("/Users/whoami/root4.crt", "r") as fp:

...  crt_data = fp.read()

...

>>> cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, crt_data)

>>> a = cert.to_cryptography()

>>> a.signature_algorithm_oid.dotted_string

'1.2.840.113549.1.1.5'

>>> a.subject

<Name(C=CN,O=iTrusChina,OU=China Trust Network,CN=iTrusChina Class 2 Root CA - G3)>

>>> a.serial_number

957904914256988596466594905800520123123

>>> b = 'CN=iTrusChina Class 2 Root CA - G3,OU=China Trust Network,O=iTrusChina,C=CN'

>>> b += '957904914256988596466594905800520123123'

>>> hashlib.md5(b.encode()).hexdigest()

'02941eef3187dddf3d3b83462e123456'

2.2 获取app_cert_sn

>>> with open("/Users/whoami/appCertPublicKey_appid.crt", "r") as fp:

...  crt_data = fp.read()

...

>>> cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, crt_data)

>>> certIssue = cert.get_issuer()

>>> a = cert.to_cryptography()

>>> b =  'CN=' + certIssue.CN + ',' + 'OU=' + certIssue.OU + ',' + 'O=' + certIssue.O + ',' + 'C=' + certIssue.C + str(cert.get_serial_number())

>>> hashlib.md5(b.encode()).hexdigest()

'a7ac269d14de3e3601871f55162fecba'

为何这里获取b的方式跟alipay_root_cert_sn的不一样?我开始时是这么取的,直接报isv.app-cert-not-exist,试了很多次发现这么取值接口才pass。

好了,花了一天半,转账终于成功了

啥?验签失败了,验签公钥换成alipayCertPublicKey_RSA2.crt,OK了

3. 参考链接如下,感谢你们:

golang解析支付宝根证书(获取应用证书、根证书序列号)

python接入支付宝现金红包(公钥证书模式)

同时感谢支付宝在线技术支持的耐心帮助

相关文章

  • python获取支付宝公钥证书SN

    最近支付宝给个人账号转账(接口alipay.fund.trans.toaccount.transfer)发现每天额...

  • iOS----支付宝支付

    首先需要先到支付宝开发者平台创建应用,获取公钥和私钥。 将公钥上传到支付宝,我们可以获取支付宝的公钥(支付完成时用...

  • 从PFX文件中获取私钥、公钥证书、公钥

    该类具体功能:根据pfx证书得到私钥、根据私钥字节数组获取私钥对象、根据公钥字节数组获取公钥、根据pfx证书获取证...

  • iOS集成支付宝

    1. 申请签约 商家服务 2. 生成公钥与私钥 参考博客 支付宝集成获取私钥与公钥 3. 支付宝的支付流程 ...

  • alipay提现自动转账接口对接笔记!

    开放平台秘钥获取:如果后台选的是公钥形式就不要用公钥证书来去验证,会不匹配。反之亦然!秘钥工具[https://m...

  • 在Linux Nginx配置HTTPS

    一、公钥和私钥的获取 可以购买,可以自己生成,本文假设你已经有了公钥和私钥。 二、把SSL证书中的公钥和私钥放到服...

  • tomcat/apache+https单&双向认证

    基础概念介绍:秘钥/证书/https握手/CA相关概念crt证书: 只含有公钥p12证书: 是包含证书(含公钥...

  • https免费证书申请

    证书有两种,一种是 ECC 证书(内置公钥是 ECDSA 公钥),一种是 RSA 证书(内置 RSA 公钥)。简单...

  • 11.PKI(公钥基础设施)

    •PKI(公钥基础设施) • 数字证书 •公钥和私钥 •证书颁发机构 •证书撤销列表 X.509由Fabric ...

  • iOS开发-获取本机公钥

    1、获取公钥 2、查看公钥

网友评论

      本文标题:python获取支付宝公钥证书SN

      本文链接:https://www.haomeiwen.com/subject/uleadktx.html