Принудительное использование TLS 1.2 в Guzzle

Я использую GuzzleHttp\Client для связи с API. Оператор API отключает SSL и TLS до версии 1.2 и сообщил мне, что мое приложение все еще использует более ранний протокол.

Как я могу убедиться, что Guzzle использует только последнюю версию? Я не уверен, какая у меня версия Guzzle (я ее не устанавливал), она нигде не указана в исходном коде.


person fpcjh    schedule 19.02.2016    source источник
comment
Возможно, ваш клиент поддерживает TLS 1.2, и все будет в порядке, если это единственный доступный протокол. Вам не нужно заставлять Guzzle использовать последние версии TLS: сервер все равно забирает старые версии. Вопрос, который вам действительно нужно задать: поддерживает ли мой клиент поддерживает TLS 1.2? Вам не нужно беспокоиться о принуждении вашего клиента к его использованию: это сделает сервер.   -  person TRiG    schedule 22.02.2016


Ответы (1)


До недавнего времени я работал в компании под названием WePay, которая занималась финансовой информацией, и на нее повлияли изменения PCI-DSS, в которых говорилось, что более ранние версии TLS больше не считаются безопасными и что нам нужно, чтобы все наши клиенты были переведены на TLS 1.2. Это требование PCI-DSS было смягчено до июня 2018 года, но вам все равно следует убедиться, что вы совместимы как можно раньше.

Мне было поручено провести исследование, чтобы выяснить, как это повлияет на наших клиентов (например, PHP, Java, Ruby, C#), и задокументировать все, что я нашел. То, что я пишу здесь, это по памяти, так как я больше не работаю в WePay и не имею доступа к их внутренним страницам Confluence.


Guzzle имеет несколько транспортных методов, включая потоки PHP, а также расширение cURL для PHP.

  1. Потоки PHP (такие как fsockopen()) не гарантируют поддержку TLS, поэтому на самом деле вы должны убедиться, что в вашей установке PHP установлено расширение PHP cURL (включая базовую библиотеку libcurl.so, если ваши веб-серверы работают под управлением Linux).

  2. Ваш базовый curl/libcurl ДОЛЖЕН быть версии 7.35.0 или новее. Ориентированные на потребителя Linux могут иметь более новую версию. Я могу сказать вам, что CentOS/RHEL/OracleLinux 6.8 поставляется с cURL 7.19.0 (слишком старым), а 7.3 поставляется с 7.29.0 (тоже слишком старым). Я не провожу много времени с Ubuntu/Debian/SLES, поэтому вам придется изучить эти варианты самостоятельно. Для CentOS/RHEL/OracleLinux вы можете либо скомпилировать и упаковать cURL самостоятельно, либо использовать cURL из репозиторий Cityfan (который зависит от пакетов из EPEL).

    Как всегда, никогда не доверяйте сторонним зависимостям слепо. Либо знайте, кто компилирует/упаковывает код, и доверяйте им как ресурсу, либо компилируйте/упаковывайте код самостоятельно.

  3. Вам также понадобится совместимая версия PHP. Первыми версиями PHP с поддержкой TLS 1.2 были PHP 5.5.19 и PHP 5.6.3. Версии PHP старше 5.6.0 являются EOL и больше не получают никаких обновлений безопасности, поэтому от одного специалиста к другому я настоятельно рекомендую вам обновиться, если ваша версия старше 5.6.0.

  4. Некоторые разработчики, не являющиеся носителями PHP, могут использовать код, который работает, но на самом деле вреден для вас. В большой устаревшей кодовой базе нередко можно увидеть:

    1. Старомодные потоковые функции (например, fsockopen(), fopen($remote_url)). Обычно они считаются Bad™ для HTTP(S)-запросов и ненадежны с точки зрения поддержки TLS.

    2. Вызов curl_* функций напрямую. cURL — очень сложный зверь, у которого есть много хороших и много плохих вариантов. Как правило, если вы используете функции cURL непосредственно в PHP, почти наверняка вы делаете это неправильно™.

    3. Лучший подход — использовать специальную, хорошо написанную и хорошо протестированную HTTP-библиотеку, такую ​​как Guzzle (или Requests, или Buzz), для 100% вызовов ваших веб-сервисов. Эти библиотеки являются Good™.

Если вы уверены, что:

  • На базовом сервере установлена ​​cURL/libcurl версии 7.35.0 или новее…
  • У вас установлена ​​достаточно новая версия PHP (рекомендуется по крайней мере 5.6.3)…
  • И используете Guzzle для 100 % ваших обращений к конечным точкам HTTP(S)…

Тогда вы в хорошей форме. Как только служба переключит переключатель на требование TLS 1.2, ваше приложение автоматически начнет использовать TLS 1.2.

person Ryan Parman    schedule 06.02.2017