让 Indy call 与 Paypal IPN 合作发布“贵宾犬”更改

Posted

技术标签:

【中文标题】让 Indy call 与 Paypal IPN 合作发布“贵宾犬”更改【英文标题】:Getting Indy call to work with Paypal IPN post "Poodle" changes 【发布时间】:2014-12-28 19:42:40 【问题描述】:

我有一个使用 PayPal 的 IPN 的网络应用程序。 10 月 15 日,由于 Poodle 安全漏洞,PayPal 进行了一些修改: Venture Beat: paypal-says-its-poodle-security-flaw-fix-may-break-the-service-for-some-users-merchants

此时我对https://www.paypal.com/cgi-bin/webscr 的调用开始返回SSL3_READ_BYTES:sslv3 警报握手失败

似乎有针对 php 的修复:PHP Fix

我正在为 Indy 寻找解决此问题的解决方案。我的代码如下:

IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
try
  with IdSSLIOHandlerSocket1 do begin
    SSLOptions.Method := sslvSSLv3;
    SSLOptions.Mode :=  sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSLOptions.VerifyDepth := 2;
  end;
  IdHTTP1 := TIdHTTP.create(nil);
  with IdHTTP1 do begin
    IOHandler := IdSSLIOHandlerSocket1;
    ReadTimeout := 0;
    AllowCookies := True;
    ProxyParams.BasicAuthentication := False;
    ProxyParams.ProxyPort := 0;
    Request.ContentLength := -1;
    Request.ContentRangeEnd := 0;
    Request.ContentRangeStart := 0;
    Request.ContentType := 'text/html';
    Request.Accept := 'text/html, */*';
    Request.BasicAuthentication := False;
    Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
    HTTPOptions := [hoForceEncodeParams];
  end;
  ss := TStringList.Create;
  ss.Add('cmd=_notify-validate');
  for i:= 0 to ARequestInfo.Params.count -1 do begin
    ss.Add(ARequestInfo.Params[i]);
  end;

  mPayPalServer := 'https://www.paypal.com/cgi-bin/webscr';
  mResult := HTTPDecode(IdHTTP1.Post(mPayPalServer, ss));

我尝试将 SSLOptions.Method 替换为:

SSLOptions.Method := sslvTLSv1;

但这仍然不起作用。

【问题讨论】:

ssl v3 poodle and move to tls with indy 【参考方案1】:

您的代码通过此行显式配置 SSL 处理程序以使用 SSL 3:

SSLOptions.Method := sslvSSLv3;

来自https://***.com/a/26513369/80901:

PayPal 禁用 SSLv3 以响应“POODLE”漏洞。读 大约在这里:PayPal Response,所以你的 Indy 客户不会 可以连接。

要连接,请检查支持哪些较新的协议(TLS 1.0、1.1 或 1.2)并配置 SSL 处理程序以使用此协议。

例如要使用 TLS,请指定允许的 TLS 版本:

SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];

【讨论】:

来自问题:“我尝试将 SSLOptions.Method 替换为:SSLOptions.Method := sslvTLSv1; 但这仍然不起作用。”您的回答是否试图暗示 TLSv1 仍然是错误的协议?如果是这样,那根本不会出现在您的答案中。如果不是,你想说的是什么 @hvd 我建议尝试 TLS (1.2),然后检查您收到的错误消息,更新您的问题,看看是否有人可以回答为什么它不起作用。当前的代码和错误消息肯定是由于 SSL v3 在服务器端被阻止造成的。 为了 OP 的利益,您可能会在答案中包含这些内容。 (需要明确的是,我不是提出这个问题的人。) SSLOptions.Method 属性已弃用,您应该改用SSLOptions.SSLVersions 属性:SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; @RemyLebeau - 好的,试试这个……我的 Indy 版本没有 sslvTLSv1_2;仅 [sslvSSLv2、sslvSSLv23、sslvSSLv3、sslvTLSv1]。将寻找更新。

以上是关于让 Indy call 与 Paypal IPN 合作发布“贵宾犬”更改的主要内容,如果未能解决你的问题,请参考以下文章

Paypal IPN 订阅协议

nodejs - 无法让 paypal-ipn 工作。 Paypal 不断返回“无效”

验证 IPN 呼叫来自 PayPal?

带有 IPN 的 PayPal 用户输入表单

Paypal (+ Paypal IPN) - 如何更改用户的订阅?

Paypal 中的 IPN 与 PDT