Я полностью разочарован. Я подключаюсь к ssl-серверам, и прямые соединения работают хорошо, но когда я пытаюсь добавить потоковый контекст для использования прокси или socks5, сокет не будет его использовать и в любом случае довольно хорошо подключается напрямую к этим ssl: // server, я проверяю, просматривая журнал прокси-сервера 127.0.0.1 — не было даже попыток подключения. Кроме того, можно ли обернуть поток в сервер socks5 с помощью опции socks5: // http proxy?
$ctx = stream_context_create( array(
"http" => array(
"timeout" => 15,
"proxy" => "tcp://127.0.0.1:3128",
"request_fulluri" => TRUE,
),
"ssl" => array(
"SNI_enabled" => FALSE,
)
) );
try
{
$socket = stream_socket_client( "ssl://google.com:443",
$errno, $errstr, 15, STREAM_CLIENT_CONNECT, $ctx );
}
catch ( Exception $e )
{
die( $e->getMessage() );
}
if ( $socket === FALSE )
{
echo "bad socket";
}
fwrite( $socket, "GET /\n" );
echo fread( $socket, 8192 );
// Here I am connected DIRECTLY, not thru proxy. WHY ???
// But this call succesfully uses context
echo file_get_contents("https://google.com", 0, $ctx);
Я нашел правильный путь. Это отлично соединяет серверы socks5.
$desthost = "google.com";
$port = 443;
$conflag = STREAM_CLIENT_CONNECT;
try
{
$socket = stream_socket_client( "tcp://127.0.0.1:1080", $errno, $errstr, 15, $conflag );
fwrite( $socket, pack( "C3", 0x05, 0x01, 0x00 ) );
$server_status = fread( $socket, 2048 );
if ( $server_status == pack( "C2", 0x05, 0x00 ) )
{
// Connection succeeded
}
else
{
die( "SOCKS Server does not support this version and/or authentication method of SOCKS.\r\n" );
}
fwrite( $socket, pack( "C5", 0x05, 0x01, 0x00, 0x03, strlen( $desthost ) ) . $desthost . pack( "n", $port ) );
$server_buffer = fread( $socket, 10 );
if ( ord( $server_buffer[0] ) == 5 && ord( $server_buffer[1] ) == 0 && ord( $server_buffer[2] ) == 0 )
{
// Connection succeeded
}
else
{
die( "The SOCKS server failed to connect to the specificed host and port. ( " . $desthost . ":" . $port . " )\r\n" );
}
stream_socket_enable_crypto( $socket, TRUE, STREAM_CRYPTO_METHOD_SSLv23_CLIENT );
}
catch ( Exception $e )
{
die( $e->getMessage() );
}
if ( $socket === FALSE )
{
die( "bad socket" );
}
fwrite( $socket, "GET /\n" );
echo fread( $socket, 8192 );
Других решений пока нет …