Ошибка CURL: 140770FC: подпрограммы SSL: SSL23_GET_SERVER_HELLO: неизвестный протокол - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь использовать прокси и сертификат SSL с CURL, но я получаю ошибки.

Вот код CURL:

//Website
$url = 'https://www.stubhub.com';

//Curl
$curl=curl_init();

//SSL
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $curl, CURLOPT_CAINFO, 'C:\xampp\cacert.pem' );

curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
curl_setopt($curl, CURLOPT_REFERER, $url);
curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_FAILONERROR, true );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLINFO_HEADER_OUT, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 0 );
curl_setopt( $curl, CURLOPT_TIMEOUT, 0 );
curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' );

//Proxy
curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($curl, CURLOPT_PROXY, '177.190.147.241:41545');
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt ($curl, CURLOPT_PORT , 80);

curl_setopt($curl, CURLOPT_COOKIEFILE,__DIR__."/cookie.txt");
curl_setopt( $curl, CURLOPT_MAXREDIRS, 10 );
curl_setopt( $curl, CURLOPT_ENCODING, '' );

curl_setopt( $curl, CURLOPT_VERBOSE, true );
curl_setopt( $curl, CURLOPT_NOPROGRESS, true );
curl_setopt( $curl, CURLOPT_STDERR, $vbh );

Я получаю следующееОтвет:

* Rebuilt URL to: https://www.stubhub.com/
*   Trying 177.190.147.241...
* TCP_NODELAY set
* Connected to 177.190.147.241 (177.190.147.241) port 41545 (#0)
* Establish HTTP proxy tunnel to www.stubhub.com:80
> CONNECT www.stubhub.com:80 HTTP/1.1
Host: www.stubhub.com:80
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1
Proxy-Connection: Keep-Alive

< HTTP/1.1 200 OK
< 
* Proxy replied OK to CONNECT request
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: C:\xampp\cacert.pem
  CApath: none
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Curl_http_done: called premature == 1
* Closing connection 0
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Как это исправить?

1 Ответ

0 голосов
/ 21 октября 2018
* Rebuilt URL to: https://www.stubhub.com/

Вы пытаетесь достичь URL https://www.stubhub.com/ - это означает, что данный хост на порту 443 (по умолчанию для https) с протоколом https (т.е. HTTP через TLS).

Но по неизвестным причинам вы явно указываете, что порт 80 должен использоваться вместо порта 443:

curl_setopt ($curl, CURLOPT_PORT , 80);

Это означает, что он не будет подключаться к хосту на порту 443, а на порту 80:

* Establish HTTP proxy tunnel to www.stubhub.com:80
> CONNECT www.stubhub.com:80 HTTP/1.1

Порт 80 предназначен для простого HTTP.Тем не менее, клиент будет пытаться использовать https (HTTP поверх TLS), так как это то, что сказал URL.Таким образом, клиент попытается инициировать квитирование TLS, отправив ClientHello.Поскольку сервер ожидает простой HTTP-запрос, но вместо этого получает TLS ClientHello, он ответит ответом об ошибке HTTP.Затем клиент попытается проанализировать этот ответ как ожидаемый ответ TLS и потерпит неудачу:

error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Как это исправить?

Не устанавливать CURLOPT_PORT равным 80Просто не устанавливайте CURLOPT_PORT так, чтобы он был взят из URL.Из документации :

Этот параметр устанавливает номер в качестве номера удаленного порта для подключения, вместо того, который указан в URL или по умолчаниюпорт для используемого протокола.Обычно вы просто позволяете URL решить , какой порт использовать, но это позволяет приложению переопределить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...