Не ясно, пытаетесь ли вы использовать Apache Httpd в качестве прокси-сервера, это объясняет код состояния 400, который вы получаете.CONNECT
используется клиентом и отправляется на прокси-сервер (возможно, Apache Httpd, но обычно нет), а не на целевой веб-сервер.
CONNECT
используется между клиентом и прокси-серверомперед установлением соединения TLS между клиентом и конечным сервером.Клиент (C) подключается к прокси (P) proxy.example.com
и отправляет этот запрос (включая пустую строку):
C->P: CONNECT www.example.com:443 HTTP/1.1
C->P: Host: www.example.com:443
C->P:
Прокси-сервер открывает TCP-соединение для www.example.com:443
(PS) и отвечает наклиент с кодом состояния 200, принимая запрос:
P->C: 200 OK
P->C:
После этого соединение между клиентом и прокси-сервером (CP) остается открытым.Прокси-сервер передает все по соединению CP к и от PS.Клиент обновляет свое активное (PS) соединение до соединения SSL / TLS, инициируя квитирование TLS на этом канале.Поскольку теперь все ретранслируется на сервер, это похоже на обмен TLS непосредственно с www.example.com:443
.
Прокси-сервер не играет никакой роли в рукопожатии (и, следовательно, с SNI).Рукопожатие TLS эффективно происходит непосредственно между клиентом и конечным сервером.
Если вы пишете прокси-сервер, все, что вам нужно сделать, чтобы позволить вашим клиентам подключаться к HTTPS-серверам, читается в CONNECT
запросите, подключитесь от прокси к конечному серверу (указанному в запросе CONNECT
), отправьте клиенту ответ 200 OK
, а затем перешлите все, что вы прочитали, с сервера на сервер, и наоборот.
RFC 2616 рассматривает CONNECT
как способ создания простого туннеля (который он есть).В RFC 2817 есть больше об этом, хотя остальная часть RFC 2817 (обновления до TLS в непрокси-HTTP-соединении) используется редко.
Похоже, что выПопытка сделать это имеет соединение между клиентом (C) и прокси (P) по TLS.Это нормально, но клиент не будет использовать CONNECT
для подключения к внешним веб-серверам (если только это не соединение с сервером HTTPS).