невозможно получить изображение с помощью php CURL с SSL

1

поэтому я пытаюсь сделать CURL-соединение с помощью PHP.... когда я использую командную строку здесь, что возвращается

curl -iv https://example.com/image.gif
* Hostname was NOT found in DNS cache
*   Trying ip.ad.dr.es.ss...
* Connected to site.com (ip.ad.dr.es.ss) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
* Server certificate: example.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
> GET /image.gif HTTP/1.1
> User-Agent: curl/7.37.1
> Host: example.com
> Accept: */*
> 
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Content-Type: image/gif
Content-Type: image/gif
< Last-Modified: Thu, 14 Jul 2011 22:16:46 GMT
Last-Modified: Thu, 14 Jul 2011 22:16:46 GMT
< Accept-Ranges: bytes
Accept-Ranges: bytes
< ETag: "09bd8b77342cc1:0"
ETag: "09bd8b77342cc1:0"
* Server Microsoft-IIS/7.5 is not blacklisted
< Server: Microsoft-IIS/7.5
Server: Microsoft-IIS/7.5
< X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
< X-UA-Compatible: IE=EmulateIE10, requiresActiveX=true
X-UA-Compatible: IE=EmulateIE10, requiresActiveX=true
< Date: Thu, 05 Nov 2015 20:57:22 GMT
Date: Thu, 05 Nov 2015 20:57:22 GMT
< Content-Length: 43
Content-Length: 43
< Set-Cookie: BIGipServerSpace=596747530.20480.0000; path=/
Set-Cookie: BIGipServerSpace=596747530.20480.0000; path=/

< 
* Connection #0 to host example.com left intact

И вот как я пытаюсь получить к нему доступ через PHP

 $ch = curl_init();
  $url_to_check = 'https://example.com/image.gif';
  curl_setopt( $ch, CURLOPT_URL, $url_to_check );
  curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
  curl_setopt($ch, CURLOPT_PORT, 443);
  curl_exec( $ch );
  $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  echo curl_error($ch);
  echo '||';
  echo $httpcode;
  curl_close( $ch );

Но потом он заканчивается возвратом

Пустой ответ с сервера || 0

Что я сделал не так? Как я могу получить изображение с помощью SSL через php CURL?

  • 0
    $res = curl_exec($ch); if ($res === false) { die(curl_error($ch)); } нет смысла пытаться получить код состояния http, если запрос HTTP не может быть сделан в первую очередь. ПЕРВАЯ проверка ошибок на уровне скручивания.
Теги:
curl
encryption
ssl
ssl-certificate

1 ответ

3
Лучший ответ

Какую версию cURL использует ваш PHP? Возможно, он не поддерживает TLS 1.2, который был добавлен в cURL 7.34.0.

Или ваш комплект СА может не распознать ЦС сайта, к которому вы подключаетесь.

Попробуйте добавить:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

Чтобы увидеть вывод отладки cURL в PHP, как вы получаете в командной строке, вы можете добавить:

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'w'));

Это может пролить свет на проблему, а также вызвать var_dump(curl_getinfo($ch)); после выполнения запроса.

  • 0
    сервер php использует версию 7.34.0, но PHP curl смог правильно получить en.wikipedia.org/static/favicon/wikipedia.ico, хотя он также использует TLS 1.2 ..... какие-нибудь идеи?
  • 0
    @pillarOfLight ru.wikipedia.org поддерживает TLS 1.0, TLS 1.1 и TLS 1.2 для совместимости (НЕТ SSLv2 или SSLv3), поэтому ваш локон смог его получить. Если сайт поддерживает только tls 1.2, тогда cURL <7.34.0 не сможет его получить. Вам нужно будет обновить модуль PHP cURL (или, если он встроен в PHP, обновить PHP и скомпилировать с более новой версией cURL и OpenSSL).
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню