Как заставить определенную версию TLS в контексте потока PHP для транспорта ssl: //?

Как я могу заставить TLSv1.0 в контексте потока PHP при попытке доступа кhttps URL? Я

Я ищу что-то вроде этого:

$context = stream_context_create(
  array(
    'ssl' => array(
      'protocol_version' => 'tls1',
    ),
  ));
file_get_contents('https://example.com/test', false, $context);
Фон

На самом деле я'м лицомпроблема в Ubuntu 12.04 при работе с PHPSoapClient, К сожалению, сервер яm пытается подключиться только поддерживает SSLv3.0 / TLSv1.0 и завершается неудачно при согласовании TLSv1.1 по умолчанию. Следовательно, я'Я хотел бы явно установить протоколssl:// транспорт до TLSv1.0.

Ответы на вопрос(4)

что принятый выше ответ не работает для комбинации Ubuntu 12.04 и PHP 5.4.33. Также выяснилось, что мне нужно вручную указывать сертификат при попытке openssl и curl для доступа к конечным точкам https. В итоге я использовал RHEL 7 и PHP 5.5 для достижения надежного решения, когда разрабатывал интеграцию для корпоративного приложения. Ничего против Ubuntu, но в моем конкретном случае это нет, работа.

Базовая информация

Полеprotocol_version допустимо только для контекста HTTP (HTTP 1.0 против 1.1), но не влияет на контекст SSL.

На следующей странице руководства перечислены все параметры потока для PHP:Контекстные параметры и параметры

Для всех потоковых оболочек на основе SSL доступны только следующие параметры:Параметры контекста SSL

Возможные решения / обходные пути

Первый совет: попросите администратора сервера исправить его, вместо того, чтобы обойти это в вашем клиенте ;-)

Может быть, вы можете получить это работать сciphers вариант для потоков SSL, чтобы передать только один точныйНабор шифров TLSv1.0 (это уникально для TLSv1.0) в списке, который поддерживает ваш целевой сервер.

Переключение реализации для использования cURL, скорее всего, здесь также не поможет, так как согласнозапись в их списке рассылки, там'Нет возможности принудительно установить определенную версию TLS - клиент будет понижать версию при необходимости автоматически.

ТЛ; др

В настоящее время я не знаю способа принудительно установить TLSv1.0 для соединений SSL из PHP.

 Chriki19 нояб. 2013 г., 16:03
Спасибо за Ваш ответ. К несчастью - или на самом деле к счастью - проблема, которую я имел, была в конечном счете решена на стороне сервера. Сначала у меня не было шансов убедить администраторов, но, очевидно, они тем временем обновили свой сервер. Тем не менее эта справочная информация и предложения по обходным путям могут быть полезны для других, кто сталкивается с аналогичными проблемами. Что касается вашего предложения сciphers вариант: я думаю, что пытался сделать это тогда безуспешно; но я неправильно помню. Теперь я могу'больше не проверяю ...

если кто-то хочет знать, какотключить» TLSv1.0 при создании запроса SOAP ...

$parameters = array(
    'trace' => true,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'stream_context' => stream_context_create(array(
        'ssl' => array(
            'ciphers' => 'DEFAULT:!TLSv1.0:!SSLv3'
        ),
    )),
    'connection_timeout' => 15
);

$client = new SoapClient(YOUR_WSDL_URL_HERE, $parameters);

Ключевой частью здесь является тот контекст потокашифры линия. Это означает использование шифров по умолчанию, но исключая шифры TLSv1.0 (в пакете 1.0 также есть шифры TLSv1.1). Разделитель шифрования: (что идет между пакетами) и! здесь, чтобы сказать это, чтобы исключить этот пакет (этоСложно исключить, поэтому, если он появится позже в списке, он все равно будет исключен). Мягкое исключение - символ и добавление в конец списка + символ. Чтобы добавить в порядок, просто добавьте его без чего-либо перед ним.

Зашифруйте информацию здесь:https://www.openssl.org/docs/manmaster/man1/ciphers.html#CIPHER-LIST-FORMAT

Изменить: по любой причине, включая

'ssl_method' => SOAP_SSL_METHOD_TLS,

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

 David14 дек. 2017 г., 12:39
Мне не удалось подключиться из PHP 5.5 к серверу, который больше не принимает TLS1.1. К сожалению, использование crypto_method не вариант, так как константа STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT является новой для PHP 5.6. Ваша правка об удаленииssl_method» решил проблему.
 Robert McMahan29 дек. 2017 г., 18:20
@ Давид, рад это слышать! Мне понадобилось вечно, чтобы понять, что, черт возьми, происходит. Вы'прав насчет этой константы. У меня была такая же проблема и неЯ не мог это использовать, поэтому мне пришлось искать альтернативы. Затем я приземлился в контексте потока. Это сработало, и тогда я понял, что мне нужно убрать старую константу для метода ssl, потому что он заставил ее вернуться к TLS 1.1 и потерял все.
 Adriano Rosa31 июл. 2018 г., 18:15
@ Давид, ваше предложение было полезным, но в моем случае с PHP 5.5 просто закомментируйте ssl_method, чтобы решить эту проблему.
Решение Вопроса

Пользователи PHP 5.6+

Это новая функция, описанная наPHP 5.6 Страница изменений OpenSSL.

На момент написания этого PHP5.6 находится в Beta1, и поэтомуЭто слишком полезно. Люди будущего - счастливчики!

Будущее за нами. PHP 5.6 - вещь, и его использование следует поощрять. Имейте в виду, что он не поддерживает некоторые довольно широко используемые вещи, такие как функции mysql_ *, поэтому следует соблюдать осторожность при обновлении.

Все остальные

@toubsen прав в своем ответе - это нет возможно напрямую. Разрабатывать предложенные им обходные пути ... при работе над проблемой, когда поставщик "сервер API не былПри правильном согласовании TLSv1.2 вплоть до поддерживаемого TLSv1.0 отправка небольшого подмножества шифров, казалось, позволяла согласованию завершиться правильно. Код контекста потока:

$context = stream_context_create(
    [
        'ssl' => [
            'ciphers' => 'DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:KRB5-RC4-MD5:KRB5-RC4-SHA:RC4-SHA:RC4-MD5:RC4-MD5:KRB5-DES-CBC-MD5:KRB5-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-KRB5-RC4-MD5:EXP-KRB5-RC4-SHA:EXP-RC4-MD5:EXP-RC4-MD5',
        ],
    ]
);

Пользователи SOAP

PHP»клиент SOAP нене использовать curl, и при этом он не использует контекст по умолчанию, установленный сstream_context_set_default, Таким образом, созданный контекст необходимо передать конструктору SOAPClient во втором параметре как таковой:

$soap_client = new SOAPClient('http://webservices.site.com/wsdlfile.wsdl', array('stream_context' => $context));

Почему эти шифры?

Выполнение командыopenssl ciphers на сервере выдает список поддерживаемых шифров в вышеуказанном формате. Бегopenssl ciphers -v говорит вам те, которые специфичны для TLSv1.2. Приведенный выше список был составлен из всех не-TLSv1.2-шифров, о которых сообщает OpenSSL.

openssl ciphers -v | grep -v 'TLSv1.2' | cut -d ' ' -f 1 | tr "\n" ':'

 Christopher Schultz02 февр. 2017 г., 23:12
С помощью'ciphers' в PHP 5.4, похоже, ограничивает шифры, поэтому выбор только шифров, определенных для TLSv1.2, должен работать и в 5.4.
 vahissan20 мая 2015 г., 10:39
Это работает для меня.
 Todd Hammer29 авг. 2018 г., 19:07
Это решение работало в PHP 7.0 и openssl 1.0.2k для сервера, который не будет согласовывать TLS1.2 и не будет пересматриваться вплоть до TLS1.0. Потратил слишком много времени, чтобы заставить это работать.
 Chriki19 апр. 2014 г., 14:42
Хотя я могуt проверить это больше (см. мой комментарий наtoubsen»ответ), это, кажется, правильный ответ. Я полагаю, что они нет добавилcrypto_method Опция контекста SSL для PHP 5.6, если бы в предыдущих версиях PHP было какое-либо другое решение. Итак, мыВероятно, придется жить с описанными обходными путями, пока PHP 5.6 не сможет быть использован в производстве. Спасибо!

Ваш ответ на вопрос