是否可以在没有 curl 和 wget 的情况下将 POST/GET 数据传输到 TLSv1.1+ 安全站点?

is it possible to POST/GET data to TLSv1.1+ secured site without curl and wget?

我处于这种非常不幸的境地:

我的网站曾经与支付网关交换数据,但由于 TLSv1.0 被删除,我无法再使用 php 的 cURL 库甚至 file_get_contents()(或 wget/lynx/curl 通过shell)

是否有任何解决方法,是否有任何选项可以在不使用内置库的情况下连接 TLSv1.1+ 安全服务器?

我知道 PHP 中存在一些 类,例如 phpseclib which is SSH client, great for people who can't use SSH2 module

PHP 是否存在类似的东西?有什么方法可以连接到我的网关吗?

到目前为止,我最好的想法是通过其他服务器(使用更新的软件)连接到网关

我喜欢你最初关于代理到另一台服务器的想法,除非你要绕过网关施加的安全限制,并且在处理支付信息时,这可能不是一个想法。

但是,如果您可以 运行 在您自己的服务器上更新库的 Vagrant 实例,那么您可以将不安全的请求代理到本地主机上的 Vagrant 实例并且它不会离开框,然后来自具有更新库的 Vagrant 实例与您的网关进行安全通信。

一旦我为我的非 TLS 客户端使用名为 stunnel 的实用程序,引用网站:

Stunnel is a proxy designed to add TLS encryption functionality to existing clients and servers without any changes in the programs' code. Its architecture is optimized for security, portability, and scalability (including load-balancing), making it suitable for large deployments.

我打算推荐 Stunnel。但是 dafyc 注意到了。

这些 PCI 限制并未实施以减慢人们的速度(仅.. 大声笑)。他们的存在是为了保护。

您将使用 Stunnel 解决您的问题。 但是为什么不更新网站服务器呢?

您已查明 SSL 已过时,但作为服务器,将存在其他几个错误。

如果他们探索其他一些弱点并获得 root 访问权限,他们将拥有 stunnel 密码以开始探索管道中的内容。

因此,这似乎不足以确保 PCI 希望您拥有的可靠性。

Is there any workaround, any option how to connect TLSv1.1+ secured server without using built-in libraries?

我可以想到五个解决方法:

1) 安装多个版本的 OpenSSL(甚至 Curl)是可能的(但很棘手)。您甚至可以使用 LD_PRELOAD_LIBRARY 从其他地方创建现有的二进制使用库。我认为这是一种混乱的方式。

2) Docker 这会非常简单。不幸的是,它需要一个现代内核,因此您可能无法将它安装在您的服务器上。但是您可以安装一个更现代的 OS,然后将您的服务器安装到具有旧 OS 的 Docker 容器中。但这可能与将您的网站迁移到更新的 OS.

一样多。

3) 不用 Docker,只需使用 chroot。在较新的盒子上,使用 "ldd" 查找所有依赖项。将它们(加上 curl)复制到 chroot 中。将该目录复制到您的服务器和 运行 "chrooot dir curl"。二进制文件将看到更新的库并工作。对于知道自己在做什么的人来说,这只需要几分钟即可完成设置。

4) 使用编译了更新的 OpenSSL 的静态链接版本的 curl。

5) 使用不使用 OpenSSL 的程序。例如一些 go(lang) 程序使用它们自己的加密,并编译成静态二进制文件。例如:https://github.com/astaxie/bat

前 2 个在您的设置中可能有点不切实际,但后 3 个中的任何一个都可以。

我已经发布了一个答案,但我在评论中看到您无法在服务器上安装任何工具。您可以使用名为 PHP Streams 的 PHP 本机函数。这是旧推特的代码示例 API:

  $url = 'https://api.twitter.com/1/statuses/public_timeline.json';
  $contextOptions = array(
      'ssl' => array(
          'verify_peer'   => true,
          'cafile'        => '/etc/ssl/certs/ca-certificates.crt',
          'verify_depth'  => 5,
          'CN_match'      => 'api.twitter.com',
          'disable_compression' => true,
          'SNI_enabled'         => true,
          'ciphers'             => 'ALL!EXPORT!EXPORT40!EXPORT56!aNULL!LOW!RC4'
      )
  );
  $sslContext = stream_context_create($contextOptions);
  $result = file_get_contents($url, NULL, $sslContext);

我找到了另一个解决方案。

在安全服务器上,我设置了两个 VirtualHosts - 443 用于 TLSv1.2,另一个用于我的网站,仅支持 TLSv1.0

更多信息在这里:https://serverfault.com/a/692894/122489

谢谢大家的回答。