2015-10-14 2 views
8

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

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

ответ

5

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

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

В жрать 3.0+ (обновление в соответствии с комментарием @limos'):

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

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

--- UPDATE (на основе комментариев) ---

Выбор правильной версии протокола 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 предотвратят атаки MITM.

CURLOPT_CAINFO - Fix Error: 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. Прежде чем принять решение, ознакомьтесь с оценкой безопасности Qualware SSL Labs projects.
  2. Посмотрите на this SSL Labs' article об идеальной передовой секретности и передовой практике.
  3. Протестируйте ваш клиент (веб-браузер) для любых уязвимостей с помощью SSL Labs' web tool. Это даст вам представление о том, что посмотреть и что улучшить и защитить на вашем сервере и приложении.
  4. Проверьте свой веб-сайт/веб-сервис с помощью SSL-лабораторий Qualys SSL tool.

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

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

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

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

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

Здесь также приятно OWASP guide for creating a secure layer вокруг вашего приложения.

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

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

Удачи!

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

+0

ОК, так что мы можем либо иметь его автоматического согласования (по умолчанию) или установить только одну версию протокола принять? Я надеялся, что может быть способ дать ему набор версий протокола и выбрать его самому последнему. – MattC

+0

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

+0

. Я решил обновить свой ответ, потому что на ваш вопрос нет простого ответа. – GTodorov

2

В жрать 5.3, я должен был использовать этот синтаксис:

$guzzle = new \GuzzleHttp\Client([ 
    'defaults' => [ 
     'config' => [ 
      'curl' => [ 
       CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2 
      ] 
     ] 
    ] 
]); 
Смежные вопросы