Подтвердить что ты не робот

Использовать 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);

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

4b9b3361

Ответ 1

Чтобы иметь возможность использовать 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.