Это более технический, чем практический ответ, но я объясню, что здесь происходит и почему cURL не может получить запрошенную веб-страницу.
Обратите внимание, что это, похоже, крайний случай,Он может работать в вашей системе, но не работает в других системах.См. Symantec PKI Distrust для получения дополнительной информации.
Что происходит?
Чтобы узнать, что происходит, когда cURL вызывает одиндолжен включить CURLOPT_VERBOSE
logging:
* Hostname [REDACTED] was found in DNS cache
* Trying [REDACTED]...
* TCP_NODELAY set
* Connected to [REDACTED] ([REDACTED]) port 443 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* SSL certificate problem: unable to get local issuer certificate
* stopped the pause stream!
* Closing connection 0
Из этого можно сделать вывод, что сертификат, используемый для выдачи сертификата TLS веб-сайта, не может быть найден в хранилище доверенных сертификатов CA cURL (расположенном в /etc/ssl/certs/ca-certificates.crt
на этомсистема).
Теперь можно задаться вопросом, почему это так.Это связано с тем, что не доверяет сертификату CA , который выдает сертификат для этого веб-сайта.На веб-сайте используется сертификат RapidSSL TLS, выданный до 1 декабря 2017 года. Это означает, что он попадает в раздел недоверия старых сертификатов RapidSSL.
Как это можно решить?
Ну, вы не можете ничего сделать.Владелец сайта может обновить свои сертификаты TLS.Они действительно должны это делать, потому что Chrome скоро начнет выдавать неприятные ошибки.(Ошибки уже должны появляться в бета-версиях M70. После 16 октября все выпуски [> M70] будут выдавать большие неприятные ошибки.)
За исключением того, что вы можете обойти проверки сертификатов SSL / TLS в cURL.
Я НЕ РЕКОМЕНДУЮ ЭТОГО, ВЫ НЕ ДОЛЖНЫ ОТКЛЮЧАТЬ ПРОВЕРКИ СЕРТИФИКАТА!
Вы можете использовать
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
, чтобы отключить проверки и послечто cURL вернет веб-страницу:
<?php
$url = "https://[REDACTED]";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // one should never do this
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // or this!!!
$output = curl_exec($ch);
curl_close($ch);
echo $output;
// all kinds of HTML and other things
?>
Заключение
Запрошенный веб-сайт использует сертификат, который будет не доверен / уже не доверен, и поэтому cURL не может завершить TLSрукопожатие, чтобы установить безопасное соединение с сайтом.Это все из-за недоверия к Symantec PKI .
Обратите внимание (опять же), что никогда не следует отключать проверки безопасности.