J'ai besoin de servir plusieurs applications sur HTTPS à l'aide d'une adresse IP externe.
Les certificats SSL ne doivent pas être gérés sur le proxy inverse. Ils sont installés sur les serveurs d'applications.
Un proxy inverse peut-il être configuré pour utiliser SNI et passer SSL à l'aide de la terminaison au point final?
Est-ce que cela utilise quelque chose comme Nginx ou Apache? À quoi ressemble la configuration?
Ceci IS possible avec haproxy. Vous pouvez configurer un proxy TCP et extraire le SNI et effectuer un routage en fonction de la SNI. Voici un exemple:
backend be.app1
mode tcp
no option checkcache
no option httpclose
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
tcp-request content reject
use-server server1 if { req.ssl_sni -m beg app1. }
server server1 server1:8443 check id 1 weight 0
Il est essentiel de retarder la demande jusqu'à ce que vous obteniez le SSL Hello, sinon Haprexy essaiera de créer une connexion avant de recevoir l'en-tête SNI.
J'utilise des serveurs avec poids 0 car, dans ma configuration actuelle, je n'ai qu'un serveur fonctionnant pour chaque SNI et je ne souhaite pas qu'ils reçoivent des demandes aléatoires. Vous pouvez probablement trouver de meilleures façons de jouer avec cela.
J'espère que ça aide.
Vous pouvez utiliser Sniproxy: https://github.com/dlundquist/sniproxy
Un exemple de configuration:
listener 0.0.0.0:443 {
protocol tls
table TableHTTPS
fallback 127.0.0.1:8443
}
listener 0.0.0.0:80 {
protocol http
table TableHTTP
fallback 127.0.0.1:8080
}
table TableHTTPS {
domain1.com backend1:443
domain2.org backend2:443
}
table TableHTTP {
domain1.com backend1:80
domain2.org backend2:80
}
Ceci est certainement possible, même maintenant en 2019 avec le prochain TLS 1.3! De nombreux serveurs Web ou proxy inverse spécialisés fournissent cette fonctionnalité hors de la boîte:
Ceci est un exemple de configuration pour NGinx, qui est un choix très populaire pour les configurations nécessitant un proxy inverse:
stream {
map $ssl_preread_server_name $selected_upstream {
example.org upstream_1;
example.net upstream_2;
example.com upstream_3;
default upstream_4;
}
upstream upstream_1 { server 10.0.0.1:443; }
upstream upstream_2 { server 10.0.0.2:443; }
upstream upstream_3 { server 10.0.0.3:443; }
upstream upstream_4 { server 10.0.0.4:443; }
server {
listen 10.0.0.5:443;
proxy_pass $selected_upstream;
ssl_preread on;
}
}
Les modules Nginx pertinents sont stream_core
et stream_ssl_preread
. Manuels:
Sachez que si les serveurs cibles utilisent le même certificat (ce qui n'est pas très improbable lorsque des certificats génériques sont utilisés), http/2 ne peut pas être utilisé. Il acheminera votre trafic sur le mauvais serveur.
Échantillon:
Si A.Example.com et B.Example.com sont traités par le même proxy inverse, une seule connexion sera ouverte - et diffusée sur le serveur appelée pour la première fois. Donc, si vous appelez A.Example.com, les demandes futures à B.Example.com peuvent atteindre le mauvais serveur Web.
Pour référence, voir