Убедитесь, что SoapClient отправляет запросы TLS 1.2 в PHP 5.5 - PullRequest
1 голос
/ 01 июня 2019

У нас есть сайт на старой кодовой базе, использующий PHP 5.5 (на данный момент), и одна из наших интеграций, с которой мы взаимодействуем с использованием SoapClient, сказала нам, что вскоре они отключат использование TLS <1.2. </p>

В настоящее время наши соединения так же просты:

$client = new SoapClient($soap_url);

Что мы должны сделать, чтобы убедиться, что отправляются только запросы TLS 1.2? Я нашел этот ответ , но я не совсем уверен, относится ли это к нашей ситуации; Кроме того, не уверен, что мы должны форсировать Мыло 1.1 либо?

Каковы требования с нашей стороны, чтобы мы могли отправлять запросы TLS 1.2?

1 Ответ

1 голос
/ 11 июня 2019

При согласовании соединения с сервером ваша библиотека TLS, предположим, openSSL, сообщит серверу, какая у вас максимальная поддерживаемая версия. Затем сервер выберет версию, которую он поддерживает, а клиент - обе. Итак, если ваша система client поддерживает TLS1.2, вероятно, с вашей стороны никаких действий не требуется.

Поддержка TLS 1.2 была добавлена ​​в 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.

С помощью приведенного ниже кода вы можете принудительно использовать TLS1.2, установив crypto_method в 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.1 против 1.2 , это просто разные стандарты W3C для Simple Object Access Protocol . Подробнее о некоторых отличиях можно узнать здесь .

Я просто скажу в заключение, что я не проверял это в PHP 5.5, это настолько старая версия, что в настоящее время у меня нет простого способа раскрутить ее. Думаю, что это все еще применимо.

...