是否可以在没有curl和wget的情况下将数据发送/获取到TLSv1.1 +安全站点?

时间:2015-05-15 08:41:50

标签: php linux ssl curl pci-dss

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

  • 我的网站使用过时的软件(已应用安全补丁)与OpenSSL 0.9.8o 2010年6月1日不支持TLSv1.1 / 1.2
  • 我还有支持PCI DSS的支付网关,因此SSL和早期TLS被禁用

我的网站曾经与支付网关交换数据,但随着TLSv1.0被删除,我不再使用php的cURL库甚至file_get_contents()(或wget / lynx / curl via shell)

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

我知道PHP中存在一些类,如phpseclib这是SSH客户端,非常适合那些无法使用SSH2 module的人

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

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

6 个答案:

答案 0 :(得分:4)

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

  

Stunnel是一种代理,旨在为现有客户端和服务器添加TLS加密功能,而无需对程序进行任何更改。码。其架构针对安全性,可移植性和可扩展性(包括负载平衡)进行了优化,使其适用于大型部署。

答案 1 :(得分:3)

  

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

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

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

2)这对Docker来说非常简单。不幸的是,它需要一个现代内核,因此您可能无法在服务器上安装它。但是您可以安装更现代的操作系统,然后将服务器安装到具有旧操作系统的Docker容器中。但这可能与将您的网站迁移到更新的操作系统的工作量差不多。

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

4)使用静态链接版本的curl,其中编译了较新的OpenSSL。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我打算建议Stunnel。但dafyc很好地指出。

没有实施那些PCI限制以减慢人们的速度(仅限lol)。它们是为了保护而存在的。

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

您已经确定了SSL过期,但作为服务器,还有其他几个错误可用。

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

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

答案 4 :(得分:1)

我已经发布了一个答案,但我在评论中读到你无法在服务器上安装任何工具。您可以使用名为PHP Streams的PHP本机函数。这是旧twitter 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);

答案 5 :(得分:0)

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

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

此处有更多信息:https://serverfault.com/a/692894/122489

感谢所有答案。