【问题标题】:Making sure SoapClient is sending TLS 1.2 requests in PHP 5.5确保 SoapClient 在 PHP 5.5 中发送 TLS 1.2 请求
【发布时间】:2019-10-17 18:23:19
【问题描述】:

我们在使用 PHP 5.5(目前)的旧代码库上有一个站点,我们使用 SoapClient 进行交互的其中一个集成告诉我们,他们将很快禁用 TLS

目前我们的连接很简单:

$client = new SoapClient($soap_url);

我们必须做些什么来确保只发送 TLS 1.2 请求?我找到了this answer,但我不确定这是否仍然适用于我们的情况;另外,不确定我们是否应该强制Soap 1.1

确保我们发送 TLS 1.2 请求的要求是什么?

【问题讨论】:

  • 我们在谈论什么操作系统?
  • @ficuscr CentOS.

标签: php soap soap-client tls1.2 php-5.5


【解决方案1】:

在与服务器协商连接时,您的 TLS 库(假设为 openSSL)将告诉服务器您支持的最大版本是多少。然后服务器将选择它和客户端都支持的版本。因此,假设您的 client 系统支持 TLS1.2,您可能不需要任何操作。

TLS 1.2 支持已在 1.0.1 中添加到 OpenSSL。如果您使用 el6 或更新版本并更新您的软件包,您应该没问题。像这样检查你的版本:

# openssl version
> OpenSSL 1.0.2k-fips  26 Jan 2017

您可以使用以下 nmap 命令检查服务器支持的协议/密码:

 nmap --script ssl-enum-ciphers -p 443 stackoverflow.com

现在,如果你想在使用 TLS1.1 时测试失败,或者强制使用密码什么的,你需要使用 PHP 的 stream_context_create

使用下面的代码,您可以通过将crypto_method 设置为来强制使用 TLS1.2 STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT。或者,也许对您的要求更有用,您可以在强制使用STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT 时测试失败。

<?php
$options = ['trace' => 1,
            'soap_version' => SOAP_1_2,
            'exceptions' => true,
            'location' => 'https://stackoverflow.com/foo',
            'uri' => "https://stackoverflow.com/bar",
            'stream_context' => stream_context_create([
                'ssl'=> [
                    'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT,
                    'ciphers' => 'SHA256'                        
                 ]
             ])];

$client = new SoapClient(null, $options);

try {
    $response = $client->getFoo();    
} catch (\Exception $e){    
    var_dump($client->__getLastRequest());
    var_dump($client->__getLastResponse());
    throw $e;
}


//OR, an even easier test with out a Soap Client...
$opts = [
         'ssl'=> [
             'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT,
             'ciphers' => 'SHA256',
             'verify_peer' => false,
             'verify_peer_name' => false
         ]
     ];

$context = stream_context_create($opts);
$fp = fopen('https://stackoverflow.com', 'r', false, $context);

如果事情适用于 1.2,并且您可以生成一个强制说 1.1 的错误,那么您可以非常确信事情设置正常。错误大致如下:

警告:fopen():SSL 操作失败,代码为 1。OpenSSL 错误 消息:错误:140830B5:SSL 例程:ssl3_client_hello:没有密码 可用

fopen(): 启用加密失败

当谈到 SOAP 版本 1.11.2 时,它们只是 简单对象访问协议 的不同 W3C 标准。更多关于一些差异的信息可以在here找到。

最后我只想说,我没有在 PHP 5.5 中测试过这个,这是一个太旧的版本,这些天我没有一个简单的方法来启动它。认为这一切仍然适用。

【讨论】:

  • 非常感谢。我检查了 OpenSSL 版本并得到了OpenSSL 1.0.2k-fips 26 Jan 2017,所以听起来不错。然后我尝试了 nmap 命令,但出现错误:nmap: command not found。不过,从您所说的来看,如果服务器似乎支持 TLS 1.2,那么我们真的不需要使用 stream_context_create 来强制它,对吗?
  • 正确。最新的客户端,如当前的 Web 浏览器,应该可以正常工作。 nmap 可以由你的包管理器安装。
  • 所以这不仅取决于我们的服务器,还取决于正在使用的客户端浏览器,我们对此无能为力吗?
  • 我只是在做比较。连接到服务器并建立安全连接的 Web 浏览器,就像您的服务器通过 cURL 与另一台服务器建立安全连接一样。只要您的服务器不等同于 IE6,您就可能没问题。不过,您是对的,例如,如果 Web 服务器需要 TLS 1.2,则某些 older mobile device web browsers 可能最终无法通过 HTTPS 连接。
  • 需要明确的是,使用像 cURL 这样的服务器端 http 客户端,最终用户的网络浏览器不是一个因素。他们的浏览器没有建立连接,你的网络服务器是。不是故意混淆视听/
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2018-12-10
  • 2015-03-10
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多