Sto scrivendo un proxy HTTP e non riesco a capire alcuni dettagli sulla creazione di una richiesta CONNECT su TLS. Per ottenere un'immagine migliore, sto sperimentando Apache per osservare come interagisce con i clienti. Questo è dal mio host virtuale predefinito.CONNECT request to a forward proxy HTTP su una connessione 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 conversazione tra Apache e il mio client va così.
a. il client si connette a example.com:443
e invia example.com
nell'handshake TLS.
b. il client invia una richiesta 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
. Il log degli errori di Apache dice
Hostname example.com provided via SNI and hostname 192.168.1.1
provided via HTTP are different.
Sembra che Apache non guarda l'intestazione host diverso da quello di vedere che è lì da HTTP/1.1 richiede. Ottengo identico comportamento fallito se il client invia Host: foo
. Se faccio la richiesta HTTP a example.com:80 senza TLS, allora Apache mi collegherà a 192.168.1.1:22.
Non capisco completamente questo comportamento. C'è qualcosa di sbagliato nella richiesta CONNECT? Non riesco a localizzare le parti rilevanti delle RFC che spiegano tutto questo.
SNI sopra indica il nome host inviato nell'handshake, non l'intestazione host. Come scritto nella mia risposta qui sotto, la combinazione di proxy SSL e CONNECT non è tipica. Sembra che Apache non si aspetti affatto questo dato che convalida i certificati. Puoi provare 'SSLStrictSNIVHostCheck off 'in Apache. – eckes