Используйте cURL с SNI (указание имени сервера)

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

мой локон перестал работать в результате этого перехода в 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 с SNI и все еще проверять SSL (не нужно использовать-k). Есть еще один параметр в PHP или завиток я могу обойти это?

1 ответов


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

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

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

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

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