Использовать cURL с SNI (имя сервера)

Я пытаюсь использовать cURL для публикации в API, который только начал использовать SNI (чтобы они могли размещать несколько сертификатов ssl на 1 IP-адрес).

Мой cURL прекратил работать в результате этого перехода к SNI. Они объяснили, что это связано с тем, что cURL получает * .domain-a.com вместо * .domain-b.com, поэтому SSL терпит неудачу.

Кажется, это ошибка в cURL, потому что URL-адрес API не имеет ошибок при посещении браузера.

Используя этот код, он работает:

exec('curl -k -d "parameters=here", https://urlhere.com/', $output); print_r($output); 

Однако использование -k плохо, потому что оно не проверяет сертификат SSL.

Используя этот код, НЕ работает:

 exec('curl -d "parameters=here", https://urlhere.com/', $output); print_r($output); 

Поэтому мой вопрос: как я могу использовать curl with SNI и все еще проверять SSL (не использовать -k). Есть ли другой параметр в PHP или параметр cURL, который я могу настроить для этого?

Чтобы иметь возможность использовать SNI, требуются три условия:

  • Используя версию Curl, которая поддерживает ее, как минимум 7.18.1, согласно журналам изменений .
  • Использование версии Curl, скомпилированной против библиотеки, поддерживающей SNI, например OpenSSL 0.9.8j (в зависимости от параметров компиляции некоторых старых версий).
  • Использование TLS 1.0 по крайней мере (не SSLv3).

Обратите внимание, что код отладки Curl ( -v ) отображает только номер основной версии (в основном для различения сообщений SSLv2 и SSLv3 +, см. ssl_tls_trace ), поэтому при использовании TLS 1.0 или выше будет отображаться «SSLv3» (потому что они, эффективно SSL v3.1 или выше, 3 – это тот же самый номер версии).

Вы можете проверить, что ваша установленная версия curl может использовать SNI с помощью Wireshark. Если вы создаете соединение с помощью curl -1 https://something , если вы раскрываете сообщение «Клиент Hello», вы должны иметь возможность видеть расширение « server_name ».

Я не уверен, какая версия SSL / TLS используется по умолчанию (в зависимости от ваших параметров компиляции), когда вы используете curl без -1 (для TLS 1.0) или -3 (для SSLv3), но вы можете попытаться заставить -1 на ваша команда, так как в любом случае она не будет работать с SSLv3.