Я пытаюсь использовать 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 ( -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.