原文链接:
博客原文传送门:支付网关接入中的SSL连接及签名调试技巧
支付平台网关接入是一件吃力不讨好的事情。 做过的人都知道,它的技术含量不高,但工作内容极其繁琐,费时费力。 对于商户支付平台的开发者来说,接入各家银行会涉及阅读基础支付机构接入文档、分析基础支付用例、分析双方通信方式、消息格式、连接和加密方式等。山人还查阅了目前几个主流的支付渠道,他整理了一些应急小技巧。
1 个 SSL 连接
目前国内主流仍然是基于B/S架构的Web模式。 使用基于SSL加密的HTTP协议。 银行侧提供标准的请求方式(如GET或POST)、相应的参数格式(如Json、XML等)。 由于支付本身对交易通信的安全性要求较高,因此SSL加密是必要的。 但由于前段时间该漏洞影响巨大,很多网站对SSL加密密钥和证书的要求越来越高。 许多旧的 SSL 协议不再受支持。 例如,网站的SSL协议不再支持SSL2。 相应的加密支持芯片级别也进行了升级。 这些 ssl 连接详细信息对于连接都很重要。 最近我发现一个网站可以分析网站的SSL协议细节。 SSL Lab 可以非常详细地分析网站的 SSL 连接详细信息。 不仅对我们分析SSL的安全性非常重要,而且对我们连接支付网关也有很好的参考作用。
SSL连接的认证方式分为单向认证和双向认证。 前者是指往往只有客户端对服务器证书进行认证,服务器并不对客户端证书进行认证。 大多数支付网关的商户,如支付宝、招商银行等,实际上都采用单向认证。 后者意味着不仅客户端必须验证服务器的证书,服务器也必须验证客户端的证书。
a-服务器证书
服务器证书是服务提供商在虚拟网络中的身份证书。 通过权威第三方CA( )机构注册。 最常用的是,等等,比如,等等都是颁发的证书。 银联使用证书。 一般来说,这些机构采用的是比较权威的认证方式,流程相对繁琐,费用也比较高。 因此,一些组织也使用自签名证书,这可能是最广为人知的一种。
您可以使用以下命令查看服务器的根证书:
openssl s_client -connect payment.ebank.cmbchina.com:443 -showcerts
如果您想下载服务器的证书,可以直接在浏览器中点击网址最左侧的小锁符号查看证书信息,然后进入相应浏览器的证书管理进行下载。 如果您想下载乳山人下载的签名证书演示版,请点击这里。 SSL 证书采用标准 x509 格式,包含颁发者和授予者信息、证书签名算法和公钥。 从证书中提取公钥:
openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
对于自签名证书,您可以先生成密钥,然后创建证书请求文件,并自行签名:
openssl genrsa -out prvtkey.pem 1024/2048 # create key openssl req -new -key prvtkey.pem -out cert.csr # create cert request openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095 # generate ca cert
b- 客户端证书
如果服务器只允许特定客户端访问,它可以颁发唯一标识该客户端的客户端证书。 对于单向身份验证服务器,不需要客户端证书。 只需将获取到的服务器证书安装到指定的证书目录即可实现认证服务器。
例如Java主要用来存储服务器证书。 您可以使用以下命令创建一个文件,
keytool -import -file C:\cascerts\firstCA.cert -alias firstCA -keystore myTrustStore
然后将获取到的服务器根证书放入:
keytool -import -trustcacerts -file cacert.pem.cer -alias tenpay_ca -keystore wechat-cert.ssl.truststore.jks keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts
如果安装了客户端证书,则创建一个(命令同上),然后进行客户端认证。 如果您想更改密码,
keytool -storepasswd -keystore my.keystore #Change a keystore password. keytool -keypasswd -alias -keystore my.keystore #Change the key's password
证书有多种格式,最常见的是 pem 格式和 pfx 格式。 国内很多支付机构的客户端证书经常使用pfx(或者p12后缀,其实格式都是PKCS#12标准)。 要将 pfx 格式转换为 pem 格式,可以使用以下命令:
openssl pkcs12 -in acp700000000000001.pfx -out prikey.pem -nocerts # pfx -> pem openssl x509 -in mycert.crt -out mycert.pem -outform PEM # crt -> pem
通常客户端的pfx格式证书还包含私钥。 从 pfx 中提取私钥如下:
openssl pkcs12 -in publicAndprivate.pfx -nocerts -out privateKey.pem
2. 加密签名算法
SSL协议在连接层实现加密,通常支付网关也在数据层实现加密和签名。 例如,当客户在亚马逊选择支付宝作为支付方式时,亚马逊就会向支付宝网关发起支付请求。 请求表单包含支付参数和相应的签名,以更精细地确保支付请求确实是由亚马逊发起的。 支付宝收到请求时,首先验证签名是否正确。 常用的加密算法如DSA、RSA等,以及摘要算法如SHA1、MD5等。由于近期安全事件不断增多,接入商户的基本要求是高质量的加密签名标准。
加密和签名是相对的过程。 加密过程是商户使用自己的私钥对发送到银行服务器的请求进行加密。 银行收到请求后,使用商户侧提供的公钥来验证签名。 生成响应后,它用自己的私钥进行签名。 商户收到银行的响应信息后,使用银行提供的公钥进行验证。 签名保证了信任来源的真实性,因为商家是唯一拥有自己私钥的人。 当银行验证签名正确时,就意味着信任确实是商户发送的。 因此,它可以保证信息不被篡改,但不能保证信息不被窃听。 加密对明文信息进行重新编码,保证信息不被窃听。 加密过程是商户使用自己的公钥提出加密请求,银行收到后使用商户私钥给出的私钥进行解密。 然后银行使用自己的公钥对响应进行加密,商户收到后使用银行提供的私钥进行解密。 由于国内大部分国家都依赖SSL层进行数据加密,实际网关访问大多只使用签名。 最常用的签名算法有MD5、SHA1等。
a- 签名和验证过程
对称算法和非对称算法的签名和签名验证过程是不同的。 对于MD5、SHA1等对称算法,待签名的文本通常以原始参数的密钥对的形式构造。 值得注意的是,这里的原始字符串是指未传递的原始键值对。 通常,空值等不参与签名过程。 最后,将签名构造成键值对并附加到请求参数中。 在签名验证过程中,使用相同的方法构造待签名的文本字符串,并在获得签名后比较请求中传递的参数。 非对称签名构造一串签名,并将其与当前签名值一起传递到签名验证算法中。
b- 公共和私人数据生成和通用格式
RSA仍然是主流的签名方法,通常用于生成或提取RSA公钥和私钥。 例如生成2048位的私钥对,
`openssl genrsa -out privatekey.txt 2048`
从私钥对导出公钥,
`openssl rsa -in key.pem -pubout -out pubkey.pem`。
从 PEM 证书中提取公钥,
openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
从私钥生成证书,
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem
PEM 格式的 RSA 私钥也有不同的格式。 最常见的是 PKCS#1 和 PKCS#8,如下:
#Legacy PKCS#1 Format -----BEGIN PRIVATE KEY----- BASE64 ENCODED DATA -----END PRIVATE KEY----- #PKCS#8 Format -----BEGIN RSA PRIVATE KEY----- BASE64 ENCODED DATA -----END RSA PRIVATE KEY-----
有一个经典的答案解释了两者之间的区别:what-is-the----rsa--key-and---key
简单来说,PKCS#1格式只是一个RSA密钥,相当于PKCS#8中的RSA密钥对象。 PKCS#8不仅具有PKCS#1中包含的RSA密钥对象,还包含版本算法标识符。 当然,您也可以使用以下命令将 PKCS#1 格式转换为 PKCS#8 格式:
openssl rsa -in begin_private_key.key -out begin_rsa_private_key.key
以上命令汇总仅结合了支付网关调试过程中常用的命令。 这些命令对于目前国内第三方支付机构和银行的接入来说应该足够了。 后续如有补充,会持续更新。
宋龙和所有的鱼。
三个参考
[1].API。
[2].支付宝开放平台。