确保SoapClient在PHP 5.5中发送TLS 1.2请求

时间:2019-06-01 11:28:44

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

我们在旧代码库上有一个使用PHP 5.5的网站(目前),并且我们使用SoapClient进行接口的集成之一告诉我们,他们不久将禁用TLS <1.2。

当前我们的连接非常简单:

$client = new SoapClient($soap_url);

我们该怎么做才能确保仅发送TLS 1.2请求?我找到了this answer,但是我不确定这是否仍然适用于我们的情况;另外,不确定我们是否应该强制使用 Soap 1.1

对我们而言,确保我们发送TLS 1.2请求有什么要求?

1 个答案:

答案 0 :(得分:1)

在协商与服务器的连接时,假设您的TLS库为openSSL,它将告诉服务器最大支持的版本是什么。然后,服务器将选择它所支持的版本,而客户端都将支持该版本。因此,假设您的 client 系统支持TLS1.2,则您可能不需要采取任何措施。

TLS 1.0.1支持已添加到OpenSSL 1.0.1中。如果您使用的是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中测试过它,因为它是一个很旧的版本,以至于这些天我没有一个简单的方法来启动它。认为这仍然适用。