Запрос CONNECT к прямому прокси-серверу HTTP через соединение SSL?

Я пишу HTTP-прокси, и у меня возникли проблемы с пониманием некоторых деталей выполнения запроса CONNECT через TLS. Чтобы получить лучшее представление, я экспериментирую с Apache, чтобы наблюдать, как он взаимодействует с клиентами. Это с моего виртуального хоста по умолчанию.

NameVirtualHost *:443
<VirtualHost>
  ServerName example.com
  DocumentRoot htdocs/example.com  
  ProxyRequests On
  AllowConnect 22
  SSLEngine on
  SSLCertificateFile /root/ssl/example.com-startssl.pem
  SSLCertificateKeyFile /root/ssl/example.com-startssl.key
  SSLCertificateChainFile /root/ssl/sub.class1.server.ca.pem
  SSLStrictSNIVHostCheck off
</VirtualHost>

Разговор между Apache и моим клиентом происходит следующим образом.

a. клиент подключается к example.com:443 и отправляет example.com в подтверждении TLS.

b. клиент отправляет HTTP-запрос.

CONNECT 192.168.1.1:22 HTTP/1.1
Host: example.com
Proxy-Connection: Keep-Alive

c. Apache сообщает HTTP / 1.1 400 Bad Request . В журнале ошибок Apache указано

Hostname example.com provided via SNI and hostname 192.168.1.1
provided via HTTP are different. 

Похоже, что Apache не смотрит на заголовок Host, кроме как для того, чтобы увидеть, что он там есть, поскольку этого требует HTTP / 1.1. Я получаю идентичное неудачное поведение, если клиент отправляет Host: foo . Если я сделаю HTTP-запрос на example.com:80 без TLS, то Apache подключит меня к 192.168.1.1:22.

Я не совсем понимаю это поведение. Что-то не так с запросом CONNECT? Кажется, я не могу найти соответствующие части RFC, которые объясняют все это.

14
задан sigjuice 12 August 2013 в 16:20
поделиться