Estoy escribiendo un proxy HTTP y estoy teniendo problemas para entender algunos detalles de hacer una solicitud CONNECT sobre TLS. Para obtener una mejor imagen, estoy experimentando con Apache para observar cómo interactúa con los clientes. Esto es de mi host virtual predeterminado.¿CONECTA la solicitud a un proxy HTTP directo a través de una conexión SSL?
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>
La conversación entre Apache y mi cliente es la siguiente.
a. el cliente se conecta al example.com:443
y envía example.com
en el protocolo de enlace TLS.
b. el cliente envía una solicitud HTTP.
CONNECT 192.168.1.1:22 HTTP/1.1
Host: example.com
Proxy-Connection: Keep-Alive
c. Apache dice HTTP/1.1 400 Bad Request
. El registro de errores de Apache dice
Hostname example.com provided via SNI and hostname 192.168.1.1
provided via HTTP are different.
Parece que Apache no se fija en el encabezado de host que no sea para ver que es allí desde HTTP/1.1 requiere. Obtengo un comportamiento fallido idéntico si el cliente envía Host: foo
. Si realizo la solicitud HTTP a example.com:80 sin TLS, entonces Apache me conectará a 192.168.1.1:22.
No entiendo completamente este comportamiento. ¿Hay algún problema con la solicitud CONNECT? Parece que no puedo encontrar las partes relevantes de las RFC que explican todo esto.
SNI arriba significa el nombre de host enviado en el protocolo de enlace, no el encabezado de host. Como está escrito en mi respuesta a continuación, mezclar proxies SSL y CONNECT no es típico. Parece que Apache no espera esto, ya que valida el certificado. Puedes probar 'SSLStrictSNIVHostCheck off' en Apache. – eckes