Paypal 使用签名,现在需要客户端证书

Posted

技术标签:

【中文标题】Paypal 使用签名,现在需要客户端证书【英文标题】:Paypal was working with signature, now requires client certificate 【发布时间】:2013-09-26 05:05:27 【问题描述】:

我正在使用 SOAP XML 在沙盒中集成 PayPal Express Checkout。 SetExpressCheckout 在 2013 年 9 月 18 日使用凭据签名正常工作。我没有更改我的代码或 Web 服务器。我确实开始使用 NVP 处理 Callback,因为没有可用的 SOAP 版本的 Callback。第二天,SetExpressCheckout 停止工作。我现在收到以下错误:“80072f0c 需要证书才能完成客户端身份验证”尝试发布到 https://api-3t.sandbox.paypal.com/2.0/

问题 1:尝试使用 NVP 回调是否会导致 PayPal 的 API 服务器现在需要客户端证书而不是签名?

问题 2:对于这种行为变化还有其他解释吗?

问题 3:我应该从我的沙盒帐户中删除签名并改为申请 API 证书吗? (尽管 PayPal 建议使用签名而不是证书。)

注意:我尝试过使用自己的沙盒签名以及通用的“始终有效”的沙盒签名。我也尝试过发布到 api-3t.sandbox.paypal.com/2.0/ 和 api.sandbox.paypal.com/2.0/(没有 -3t)。这些努力都没有消除错误。

谢谢,克里斯 H

【问题讨论】:

你能从命令行运行“nslookup api-3t.sandbox.paypal.com”并发布它解析到的IP吗? 我也面临同样的问题。该 API 直到昨天才起作用,突然停止工作并要求证书。但是,如果我们在浏览器中通过 URL 发出 GET 请求,它会返回令牌(NVP 参数作为查询字符串发送)。 nslookup 命令返回:23.51.43.42 nslookup 命令为我返回了 23.50.75.42 我有同样的问题,从 2013 年 9 月 20 日开始。到那时,对api-3t.sandbox.paypal.com/nvp 的调用工作正常。 nslookup 命令返回 23.50.75.42。 至少有三个开发者遇到了同样的问题。三人都报告说该问题首先发生在上周的星期四或星期五。这似乎表明沙盒 API 已损坏。我向 PayPal 技术支持提交了一个问题,但尚未收到回复。是否有人从 PayPal 监控 ***?我们如何知道 PayPal 是否知道这个问题?我有一个截止日期,如果没有测试能力,我的集成就无法取得太大进展。 【参考方案1】:

您还看到这个问题吗? 即使使用您从 nslookup 获得的 IP,我也无法重现它。 这是我对 23.51.43.42 的测试。我与 23.50.75.42 的结果相同

curl \
-H "Host: api-3t.sandbox.paypal.com" \
-d "USER=guus_1192700083_biz_api1.paypal.com&PWD=XXXXXXXXXX&SIGNATURE=XXXXXXXXXX&VERSION=108&METHOD=SetExpressCheckout&RETURNURL=http://www.paypal.com&CANCELURL=http://www.paypal.com&AMT=0.01&PAYMENTACTION=Authorization" \
https://23.51.43.42/nvp -kv

* About to connect() to 23.51.43.42 port 443 (#0)
*   Trying 23.51.43.42...
* 0x8001f188 is at send pipe head!
* STATE: CONNECT => WAITCONNECT handle 0x80057568; line 1032 (connection #0)
* Connected to 23.51.43.42 (23.51.43.42) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* STATE: WAITCONNECT => PROTOCONNECT handle 0x80057568; line 1145 (connection #0)
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using RC4-SHA
* Server certificate:
*        subject: C=US; ST=CALIFORNIA; L=San Jose; O=PayPal, Inc.; OU=Partner Support; CN=api-3t.sandbox.paypal.com
*        start date: 2013-08-20 00:00:00 GMT
*        expire date: 2015-08-21 23:59:59 GMT
*        issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA - G3
*        SSL certificate verify ok.
* STATE: PROTOCONNECT => DO handle 0x80057568; line 1164 (connection #0)
> POST /nvp HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: api-3t.sandbox.paypal.com
> Content-Length: 261
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 261 out of 261 bytes
* STATE: DO => DO_DONE handle 0x80057568; line 1236 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x80057568; line 1352 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x80057568; line 1363 (connection #0)
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: Apache
< Content-Length: 133
< Content-Type: text/plain; charset=utf-8
< DC: origin2-api-3t.sandbox.paypal.com
< Date: Thu, 03 Oct 2013 20:07:10 GMT
< Connection: keep-alive
< Set-Cookie: DC=origin2-api-3t.sandbox.paypal.com; secure
<
* STATE: PERFORM => DONE handle 0x80057568; line 1533 (connection #0)
* Connection #0 to host 23.51.43.42 left intact
TOKEN=EC%2d03T72513NN7526924&TIMESTAMP=2013%2d10%2d03T20%3a07%3a10Z&CORRELATIONID=4776c1624af4e&ACK=Success&VERSION=108&BUILD=7920936

【讨论】:

是的,我仍然遇到同样的问题。为了确认这确实是沙盒环境的问题,而不是我的请求代码的问题,我做了以下操作:我将签名从测试切换为实时凭据。然后,我向实时 PayPal 端点发送了一个请求。没有错误,我收到了成功的确认和令牌。这确认问题出在沙盒环境中。 我终于可以重现它了 :-) ---------- 2013-10-08 23:38:52 ::1 GET /guido/Test-XML-PayPal-Sandbox .asp |144|80072f0c|A_certificate_is_required_to_complete_client_authentication__ 80 - ::1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:24.0)+Gecko/20100101+Firefox/24.0 500 0 0 149 ------ ----------------------------- 我正在研究它似乎仅限于 ASP/IIS,请给我一两天时间。 @Viren 伙计们,这应该解决。你能试着让我知道吗? @kalpa 很高兴听到克里斯! @Viren,这对你也有用吗?谢谢!

以上是关于Paypal 使用签名,现在需要客户端证书的主要内容,如果未能解决你的问题,请参考以下文章

使用智能卡或证书在浏览器中对数据进行数字签名

如何测试需要证书(X.509 客户端证书)的 REST API?

PayPal + RESTful API + WebHooks + 自签名证书

Java 服务器自签名证书 + 客户端证书和 SSL handshake_failure

iOS WKWebView 自签名证书单向验证+双向验证

使用自签名证书连接到 SSL 服务器的客户端