Используйте 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 в любом случае.