HTTPS ile çalışmak için file_get_contents () nasıl elde edilir?


106

Kredi kartı işlemeyi kurmaya çalışıyorum ve CURL için bir geçici çözüm kullanmam gerekiyor. Test sunucusunu kullanırken (bir SSL URL'sini çağırmıyordu) aşağıdaki kod iyi çalıştı, ancak şimdi onu HTTPS ile çalışan sunucuda test ettiğimde, "akış açılamadı" hata mesajıyla başarısız oluyor.

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);
}

Yanıtlar:


89

Php betikleriniz için kullanılabilir bir https sarmalayıcısı olup olmadığını görmek için aşağıdaki betiği deneyin.

$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);

çıktı şöyle bir şey olmalı

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

@volker Bu yüzden allow_url_fopen'ı istedim
Gordon

Garip olan, openssl'nin kapalı olduğunu söylemesidir, ancak phpinfo () 'ya göre, yanlış görmediğim sürece onunla derlenmiştir.
James Simpson

phpinfo () yapılandırma satırında size bunu söyler mi yoksa "OpenSSL" adında bir bölüm mü var?
VolkerK

Tamam, sadece yapılandırma satırında, bunun için bir bölüm değil. Sanırım sorun bu mu?
James Simpson

Bunların hepsine sahibim ve hala çalışmıyor. Ve allow_url_fopen. Yalnızca https olmayan url'ler localhost'tan çalışır.
Curtis

116

Https sarmalayıcıya izin vermek için:

  • php_openssluzatma var olmalıdır ve etkin olması
  • allow_url_fopen ayarlanmalı on

Php.ini dosyasında, yoksa şu satırları eklemelisiniz:

extension=php_openssl.dll

allow_url_fopen = On

Her ikisi de kurulumumda Açık olarak ayarlandı, ancak yine de SSL hatası alıyorum "Uyarı: file_get_contents (): SSL: El sıkışma içinde zaman aşımına uğradı"
Adamantus

53

Takip etmeyi dene.

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;
}

Not: Bu, SSL doğrulamasını devre dışı bırakır, yani HTTPS tarafından sunulan güvenlik kaybedilir . Bu kodu yalnızca test / yerel geliştirme için kullanın, asla internette veya diğer halka açık ağlarda kullanmayın. Bu kod çalışıyorsa, bu, SSL sertifikasına güvenilmediği veya doğrulanamayacağı anlamına gelir; bu, ayrı bir sorun olarak düzeltmeyi düşünmeniz gerekir.


29
Kredi kartı işlemleriyle uğraşırken neden SSL doğrulamasını devre dışı bırakasınız?
Peter

Teşekkürler, numara burada: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);
Dylan B

46
$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));

Bu, bir HTTPS olup olmadığına bakılmaksızın url'den içeriği almanıza izin verecektir.


Teşekkürler! Bu benim tarafımda işe yaradı. FB Open Graph API'yi çağırmaya çalışıyordum :)
kod çözme

Geçersiz sertifikaya sahip bir etki alanıma yalnızca test amacıyla erişmeye çalışıyordum ve bu SSL doğrulamasını devre dışı bıraksa da ihtiyacım olan buydu.
carla

Harika! 5 gündür XAMPP test sitemde file_get_contents kullanarak bir airbnb takvimi indirmeye çalışıyorum, bu sorunu çözdü, teşekkürler.
JohnnyBeGood

Https üzerinden geçerli bir HTTP sertifikası olmadan Vagrant test kutusuna bağlanmaya çalışırken benim için çalıştı. Burada ayarlanan PHP SSL Bağlam seçeneklerine bağlantı: php.net/manual/en/context.ssl.php ; doğrula peer = Kullanılan SSL sertifikasının doğrulanmasını zorunlu kılın; valid_peer_name = Eş adının doğrulanmasını gerektir.
Anthony

bu SSL sertifikasını bozmuyor ve bir güvenlik açığı mı?
webchun

10

Bunun nedeni muhtemelen hedef sunucunuzun geçerli bir SSL sertifikasına sahip olmamasıdır.


Talep eden sunucunun bir SSL sertifikasına sahip olması gerekmez.
ceejayoz

15
İsteyen sunucuyu söylemedim, hedef sunucu dedim.
Emil Vikström

2
Bu bana kaymayı öğretecek. Heh! Lütfen özürlerimi kabul edin ve oy verin.
ceejayoz

Hedef sunucunun geçerli bir SSL sertifikası var.
James Simpson

@James, bunun yerine cURL ile bağlanmayı denerseniz bir hata alır mısınız? Yoksa bunu denemek kesinlikle imkansız mı?
Emil Vikström

6

Php.ini dosyanıza iki satır eklemeniz yeterlidir.

extension=php_openssl.dll

allow_url_include = On

benim için çalışıyor.


1
Muhtemelen allow_url_fopensoru dahil değil, url açmayı ilgilendirdiği için demek istiyorsun .
shukshin.ivan

5

Ben de aynı hatayı aldım. Ayar allow_url_include = Oniçinde php.inibenim için düzelttim.


5

OpenSSL desteği için derlediyseniz, HTTPS PHP 4.3.0'dan itibaren desteklenir. Ayrıca, hedef sunucunun geçerli bir sertifikası olduğundan, güvenlik duvarının giden bağlantılara izin verdiğinden ve allow_url_fopenphp.ini dosyasında true olarak ayarlandığından emin olun .


OpenSSL destekli PHP 5.2.8 kullanıyorum. Bununla aynı hatayı alıyorum ve hedef sunucunun geçerli bir sertifikası var.
James Simpson

2
güvenlik duvarı, giden https bağlantılarına izin verecek şekilde yapılandırılmış mı? Genellikle, https çalıştıran web sunucusu 80 numaralı bağlantı noktasında çalışmaz. Hatada 'akış açılamadı' dışında başka bir şey var mı?
Gordon

1
Bildiğim kadarıyla, tüm hata bu: Uyarı: fopen (https: // ...) [function.fopen]: akış açılamadı: / home / user / public_html / içinde böyle bir dosya veya dizin yok 993 numaralı hatta test.php
James Simpson

ve php.ini içindeki allow_url_fopen neye ayarlanmış?
Gordon

Bu garip. Bunun çalışıp çalışmadığını görmek için bir HTTP ve bir HTTPS url'si üzerinde bir GET yapabilir misiniz? akış bağlamı olmadan?
Gordon

3

Benim durumumda, sorun WAMP'ın CLI için Apache'den farklı bir php.ini kullanmasından kaynaklanıyordu, bu yüzden WAMP menüsünden yaptığınız ayarlarınız CLI için geçerli değil. Sadece CLI php.ini'yi değiştirin ve çalışır.


1

Bazen bir sunucu, http istek başlıklarında gördüklerine veya görmediklerine (uygun bir kullanıcı aracısı gibi) dayalı olarak yanıt vermemeyi seçer. Bir tarayıcıya bağlanabiliyorsanız, gönderdiği başlıkları alın ve bunları akış bağlamınızda taklit edin.


0

IIS'de işlevsel olmayan https ile sıkışıp kaldım. Çözüldü:

file_get_contents ('https ..) yüklenemedi.

  • https://curl.haxx.se/docs/caextract.html dosyasını indirin
  • ..phpN.N / extras / ssl altına yükle
  • php.ini'yi şu şekilde düzenleyin:

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

en sonunda!


-1

BİR URL’nin YUKARI OLUP OLMADIĞINI KONTROL ETMEK İÇİN

Sorunuzdaki kod, çalışan bir sürüme göre yeniden yazılabilir:

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.