Как указать параметры TLS / SSL в Guzzle?

Мы начинаем использовать Guzzle в PHP с кодом, который вызывает множество различных API-интерфейсов, некоторые из которых не поддерживают TLSv1.2, а некоторые из них требуют TLSv1.2.

Каков наилучший способ заставить Guzzle использовать самый последний доступный протокол, за исключением случаев, когда мы знаем, что он не будет распознан?

Это просто и легко.

$client = new Client(); $guzzle = new GuzzleClient('https://www.yourweb.com', array( 'curl.options' => array( CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 ) )); $client->setClient($guzzle); ... 

В Guzzle 3.0+ (обновление по комментариям @limos):

 'curl' => array( CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 ) 

Возможные параметры CURLOPT_SSLVERSION можно найти на официальной странице cURL: http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html

— ОБНОВЛЕНИЕ (на основе комментариев) —

Выбор правильной версии протокола SSL включает не только параметр CURLOPT_SSLVERSION, но и множество настроек cURL. Желаемый и важный результат называется «Максимальная прямая секретность». Это справедливо не только для cURL!

Вы не можете использовать несколько параметров CURLOPT_SSLVERSION (по крайней мере, я не нашел такой вариант в документации Guzzle). Когда вы определяете CURLOPT_SSLVERSION, cURL попытается использовать эту версию SSL – из документации cURL (ссылка выше о CURLOPT_SSLVERSION) – «Передайте длинный параметр, чтобы контролировать, какую версию SSL / TLS пытаться использовать».

Вы можете определить несколько безопасных шифров, но только один параметр версии SSL. Я бы не использовал ничего раньше, чем TLS 1.1. Любая ранняя версия SSL уязвима для атаки. Версия TLS 1.1 также уязвима, но тогда вы можете столкнуться с проблемами совместимости с клиентами в 1.2, если вы идете по этому маршруту. Единственное безопасное (пока, пока они не обнаружат некоторую уязвимость), является TLS 1.2.

Если приоритетом является безопасность, перейдите к самой доступной версии TLS (TLS1.2). Совместимость с клиентами – это не ваша проблема, когда есть ответственность за безопасность поставщика услуг.

Если важна безопасность, здесь представлены другие опции cURL:

  • CURLOPT_SSL_VERIFYHOST
  • CURLOPT_SSL_VERIFYPEER
  • CURLOPT_CAINFO (cURL предоставляет на своем веб-сайте CA CERT )
  • CURLOPT_SSL_CIPHER_LIST

Правильно установленные CURLOPT_SSL_VERIFYHOST и CURLOPT_SSL_VERIFYPEER предотвращают атаки MITM.

CURLOPT_CAINFO – Ошибка исправления: 35 – Неизвестная ошибка протокола SSL в соединениях. Улучшение максимальной секретности.

Вот список с cURL ciphers (CURLOPT_SSL_CIPHER_LIST), который поможет улучшить максимальную прямую секретность:

 'DHE-RSA-AES256-SHA', 'DHE-DSS-AES256-SHA', 'AES256-SHA', 'ADH-AES256-SHA', 'KRB5-DES-CBC3-SHA', 'EDH-RSA-DES-CBC3-SHA', 'EDH-DSS-DES-CBC3-SHA', 'DHE-RSA-AES128-SHA', 'DHE-DSS-AES128-SHA', 'ADH-AES128-SHA', 'AES128-SHA', 'KRB5-DES-CBC-SHA', 'EDH-RSA-DES-CBC-SHA', 'EDH-DSS-DES-CBC-SHA:DES-CBC-SHA', 'EXP-KRB5-DES-CBC-SHA', 'EXP-EDH-RSA-DES-CBC-SHA', 'EXP-EDH-DSS-DES-CBC-SHA', 'EXP-DES-CBC-SHA' 

Эти шифры были проверены против сильного списка Qualys SSL Labs (2014) и были удалены слабые шифры. Не стесняйтесь добавлять / удалять любые шифры.

Если вы все еще хотите использовать несколько параметров CURLOPT_SSLVERSION, я бы написал сценарий для этого (что, я не думаю, что это хорошая практика или необходимо). Но все же, если вы решите использовать эту функциональность по какой-либо причине, напишите какой-то код, который попытается использовать максимально возможное SSL-шифрование, а затем вернуться к следующей версии, если он не сможет подключиться.

  1. Прежде чем принять решение, взгляните на проекты Qualys SSL Labs о безопасности.
  2. Взгляните на эту статью SSL Labs о совершенной секретности и передовой практике.
  3. Тестируйте свой клиент (веб-браузер) для любых уязвимостей с помощью веб-инструментария SSL Labs . Это даст вам представление о том, что посмотреть и что улучшить и защитить на вашем сервере и приложении.
  4. Проверьте свой веб-сайт / веб-сервис с помощью SSL- сервиса Qualys SSL Labs.

Уязвимости и атаки: Longjam, FREAK, POODLE, вы называете это! Кто знает, какие другие атаки или уязвимости не обнаружены? Да! Все они влияют на ваш выбор SSL / TLS-соединения.

У вас нет контроля над клиентом (если вы его не разработали), но вы контролируете переговоры с сервером и сервером.

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

  1. Безопасность
  2. Совместимость
  3. Ремонтопригодность
  4. сложность

Если безопасность важна, пойдите с TLS1.1 как минимум. Посмотрите также на списки шифров, я бы не упустил эту часть.

Вот также хорошее руководство OWASP для создания безопасного слоя вокруг вашего приложения.

OWASP и Qualys SSL Labs – отличные ресурсы для начала. Я бы даже сделал некоторые исследования по cURL и OpenSSL, чтобы ознакомиться с недостатками, возможными вариантами безопасности и лучшими практиками.

Есть точки безопасности, о которых я не упоминаю и их не хватает, но мы не можем охватить все. Это только верхушка айсберга. Все, что не упомянуто здесь, предназначено для исследования.

Удачи!

Я буду рядом, чтобы ответить на любые вопросы, если смогу.

В Guzzle 5.3 мне пришлось использовать этот синтаксис:

 $guzzle = new \GuzzleHttp\Client([ 'defaults' => [ 'config' => [ 'curl' => [ CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 ] ] ] ]);