Как заставить file_get_contents() работать с HTTPS?

Я работаю над настройкой обработки кредитных карт, и мне нужно было использовать обходной путь для CURL. Следующий код работал нормально, когда я использовал тестовый сервер (который не вызывал URL-адрес SSL), но теперь, когда я тестирую его на рабочем сервере с HTTPS, происходит сбой с сообщением об ошибке "не удалось открыть поток".

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

13 ответов

Решение

Попробуйте следующий скрипт, чтобы увидеть, есть ли обертка https для ваших скриптов php.

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

вывод должен быть что-то вроде

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

Чтобы разрешить упаковку https:

  • php_openssl расширение должно существовать и быть включено
  • allow_url_fopen должен быть установлен в on

В файле php.ini вы должны добавить эти строки, если они не существуют:

extension=php_openssl.dll

allow_url_fopen = On
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

Это позволит вам получить контент из URL, будь то HTTPS

Попробуйте следующее.

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

Примечание. Это отключает проверку SSL, что означает, что безопасность, предлагаемая HTTPS, теряется. Используйте этот код только для тестирования / локальной разработки, никогда в Интернете или других общественных сетях. Если этот код работает, это означает, что SSL-сертификат не является доверенным или не может быть проверен, что вы должны рассматривать как отдельную проблему.

Вероятно, это связано с тем, что у вашего целевого сервера нет действительного сертификата SSL.

Просто добавьте две строки в ваш файл php.ini.

extension=php_openssl.dll

allow_url_include = On

это работает для меня.

HTTPS поддерживается начиная с PHP 4.3.0, если вы скомпилировали поддержку OpenSSL. Кроме того, убедитесь, что целевой сервер имеет действительный сертификат, межсетевой экран разрешает исходящие соединения и allow_url_fopen в php.ini установлено значение true.

У меня была такая же ошибка. настройка allow_url_include = On в php.ini исправил это для меня.

используйте следующий код:

      $homepage = file_get_contents("https://www.google.com",false,
                             stream_context_create([
                                'ssl'  => [
                                    'verify_peer'      => false,
                                    'verify_peer_name' => false,
                                ]
                            ])
            );
    
 echo $homepage;

В моем случае проблема была в том, что WAMP использовал php.ini для CLI, отличный от Apache, поэтому ваши настройки, сделанные через меню WAMP, не относятся к CLI. Просто измените CLI php.ini, и это работает.

Иногда сервер решает не отвечать на основании того, что он видит или не видит в заголовках http-запроса (например, соответствующий пользовательский агент). Если вы можете соединиться с браузером, возьмите отправляемые им заголовки и имитируйте их в контексте вашего потока.

Я застрял с нефункциональным https на IIS. Решено с помощью:

file_get_contents('https..) не загружается.

  • скачать https://curl.haxx.se/docs/caextract.html
  • установить под..phpN.N/extras/ssl
  • отредактируйте php.ini с помощью:

    curl.cainfo = "C: \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"openssl.cafile="C: \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"

Ну наконец то!

ПРОВЕРИТЬ, ЕСЛИ URL-УСТРОЙСТВО ИЛИ НЕТ

Код в вашем вопросе может быть переписан для рабочей версии:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
Другие вопросы по тегам