HTTP-клиент AMPHP с прокси-серверами использования

Я пытаюсь использовать HTTP-клиент AMPHP с прокси-серверами и не могу заставить его работать.

Я использую пример из их GitHub. (https://github.com/ampphp/http-tunnel/blob/master/examples/http-client-via-proxy.php)

Мне нужно загрузить 10 URL-адресов и использовать разные прокси для каждого URL-адреса. Текущая проблема заключается в том, что он возвращает такую ​​​​ошибку:

TLS negotiation failed: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
  error:1408F10B:SSL routines:ssl3_get_record:wrong version number

Наши прокси-серверы используют для работы сертификат (.crx). Мне не нужно проверять, действителен ли SSL, я просто хочу пропустить валидацию, поэтому я подумал, что эти строки сделают то, что мне нужно (пропустят валидацию), но это не так... ????

$clientTlsContext = new ClientTlsContext('');
$clientTlsContext->withoutPeerVerification();
$clientTlsContext->withSecurityLevel(0);

Это работает для завитка:

curl_setopt($curlResource, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlResource, CURLOPT_SSL_VERIFYHOST, 0);

Это мой код:

class AMPHPDownloaderTest
{
    /**
     * @param ConfigWithCallback[] $configsWithCallback
     */
    public static function downSerps($configsWithCallback): void
    {
        Loop::run(static function () use ($configsWithCallback) {
            try {
                $clientTlsContext = new ClientTlsContext('');
                $clientTlsContext->withoutPeerVerification();
                $clientTlsContext->withSecurityLevel(0);

                $connector = new Https1TunnelConnector(new SocketAddress('proxyi2.infatica.io', 44123), $clientTlsContext);

                $client = (new HttpClientBuilder)
                    ->usingPool(new UnlimitedConnectionPool(new DefaultConnectionFactory($connector)))
                    ->build();

                $request = new Request('http://amphp.org/');

                /** @var Response $response */
                $response = yield $client->request($request);

                $request = $response->getRequest();

                \printf(
                    "%s %s HTTP/%s\r\n",
                    $request->getMethod(),
                    $request->getUri(),
                    \implode('+', $request->getProtocolVersions())
                );

                print Rfc7230::formatHeaders($request->getHeaders()) . "\r\n\r\n";

                \printf(
                    "HTTP/%s %d %s\r\n",
                    $response->getProtocolVersion(),
                    $response->getStatus(),
                    $response->getReason()
                );

                print Rfc7230::formatHeaders($response->getHeaders()) . "\r\n\r\n";

                $body = yield $response->getBody()->buffer();
                $bodyLength = \strlen($body);

                if ($bodyLength < 250) {
                    print $body . "\r\n";
                } else {
                    print \substr($body, 0, 250) . "\r\n\r\n";
                    print($bodyLength - 250) . " more bytes\r\n";
                }
            } catch (HttpException $error) {
                echo $error;
            }
        });
    }
}

При использовании с Http1TunnelConnector вместо Https1TunnelConnector возникает эта ошибка:

Amp\Socket\TlsException: TLS negotiation failed: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

person David Pivoňka    schedule 29.06.2020    source источник


Ответы (1)


В основном вы поступаете правильно, но ClientTlsContext является неизменяемым и всегда возвращает новый экземпляр, который отбрасывается в вашем примере кода.

$clientTlsContext = (new ClientTlsContext(''))
    ->withoutPeerVerification()
    ->withSecurityLevel(0);
person kelunik    schedule 05.07.2020
comment
Спасибо, но я все еще сталкиваюсь с проблемами. Сообщение об ошибке: Amp\Socket\TlsException: TLS negotiation failed: Connection reset by peer on http://proxyv2.infatica.io:9064 Когда я использую curl -x http://proxyv2.infatica.io:9064 -L https://yahoo.com -k, все работает. Любые идеи? Я хочу использовать прокси-соединение для загрузки URL-адреса с помощью AMPHP, но без проверки SSL (например, --insecure для curl) - person David Pivoňka; 08.07.2020
comment
Я также пытался использовать сертификат, предоставленный нашим прокси-провайдером, используя: (new ClientTlsContext(''))->withCaFile('/home/xyz/proxyagent.crt');, и теперь есть другая ошибка: Amp\Http\Client\Connection\UnprocessedRequestException: The request was not processed and can be safely retried - person David Pivoňka; 08.07.2020
comment
Я заметил, что вы используете Https1TunnelConnector вместо Http1TunnelConnector, это решает проблему? - person kelunik; 29.12.2020