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

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

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

10

Решение

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

$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) — «Передать параметр long как, чтобы контролировать, какую версию 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 предотвратит атаки MITM.

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

Вот список с шифрами cURL (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.

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

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

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

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

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

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

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

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

Удачи!

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

8

Другие решения

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

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

По вопросам рекламы [email protected]