Portál AbcLinuxu, 12. května 2024 07:49


Dotaz: Apache reverzní proxy má problém s SNI při redirectu

6.1.2016 18:51 ap
Apache reverzní proxy má problém s SNI při redirectu
Přečteno: 484×
Odpovědět | Admin
Ahoj, mám apache 2.4 reverzní proxy server a za ním backendový webový apache 2.4 server poskytující reálný obsah. Pokud jdu na www.domena.cz, pak se web načte v pořádku, pokud jdu na domena.cz, pak wordpress na webovém serveru pošle redirect na www.domena.cz, ale pak vrátí proxy Bad Request. Na backend web serveru je v tu chvíli hláška:
[ssl:error] [pid 23771:tid 140277507413760] AH02032: Hostname domena.cz provided via SNI and hostname www.domena.cz provided via HTTP are different
Konfigurace VirtualHostu na proxy:
Header always set Strict-Transport-Security "max-age=31536000"
ServerName www.domena.cz
ServerAlias domena.cz

SSLProxyEngine On

SSLCertificateFile /etc/httpd/ssl/www.domena.cz/ssl.crt
SSLCertificateKeyFile /etc/httpd/ssl/www.domena.cz/ssl.key
SSLCertificateChainFile /etc/httpd/ssl/www.domena.cz/intermediate.pem

SSLProxyCACertificateFile /etc/ssl/certs/ca-bundle.crt
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on

ProxyRequests Off
<Proxy *>
  Require all granted
</Proxy>

ProxyPass / https://webserver.domena.cz/
ProxyPreserveHost on
Konfigurace VirtualHostu na webserveru:
ServerName www.domena.cz
ServerAlias domena.cz
.....
Aktuálně používám jako workaround přesměrování přímo na reverzní proxy. To funguje. Tzn. přímo reverzní proxy přesměruje domena.cz na www.domena.cz. Chtěl bych ale, aby to fungovalo i bez tohoto workaroundu. V čem může být problém? Podle sledování požadavků by to mělo fungovat:
  1. Prohlížeč odešle požadavek na https://domena.cz (v hlavičce je Host: domena.cz)
  2. Backendový web server vrátí 301, pošle Location: https://www.domena.cz
  3. Prohlížeč odešle požadavek na https://www.domena.cz (v hlavičce je Host: www.domena.cz)
  4. Proxy ale vrátí 400 Bad Request
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

6.1.2016 19:14 Filip Jirsák
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Opravdu potřebujete mezi proxy serverem a backendem SSL?

Chybu máte tady:
ProxyPass / https://webserver.domena.cz/
ProxyPreserveHost on
Říkáte proxy serveru, aby se připojil na doménu webserver.domena.cz, takže tuhle doménu proxy pošle přes SNI. Pak tam ale máte zapnuté, že hlavičku Host má předat tu, kterou poslal klient. Je to asi nedokonalost proxy serveru, protože ten by mohl Host hlavičku použít i pro SNI, jenže to by před navázáním spojení k backendu musel čekat, než mu jí klient pošle. Každopádně tahle kombinace je divná, ale když už se chcete k backendu připojovat přes SSL a mít tam jiné jméno, dávalo by největší smysl DNS název použít pouze pro výběr serveru, SNI vůbec neposílat ani ho na backendu nečíst a na backendu vybírat virtualhosta jenom pomocí hlavičky Host. Ale nevím, zda jde takhle Apache nakonfigurovat.
6.1.2016 20:54 alkoholik | skóre: 40 | blog: Alkoholik
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
Ono je to trosku jinak.
Apache pouziva pool persistentnich spojenich na backend. Spojeni se navaze s SNI Hostem z TLS prvniho pozadavku (domena.cz) a kupodivu prvni Host z HTTP hlavicky (domena.cz) proti nemu sedi.
Prijde druhy pozadavek a apache vidi, ze ho ma poslat na stejny backend. Vezme uz navazane spojeni s SNI Hostem domena.cz a posle HTTP hlavicku s Hostem www.domena.cz.
Proto v logu nevidis zadnou stiznost na webserver.domena.cz.
Je to moc pekny heisenbug, kdyz tam pristupuji na stridacku klienti na domena.cz a www.domena.cz a ceka se, ze dostanou stejnou stranku. Podle toho, ktere uz navazane perzistetni spojeni zrovna trefi to na 50% zafunguje. Pokud zadne otevrene spojeni v poolu zrovna neni, tak vsechno jakoby funguje na prvni pokus. A vsechno se samo opravuje pri timeoutu spojeni na backend.
;)
6.1.2016 21:45 ap
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
Díky, to je ono. Takže jsou v podstatě 3 řešení:
  1. Přidat ProxyPass parametr disablereuse=on, což způsobí ukončení spojení k backendu po každém requestu
  2. Přepisování url přímo na proxy
  3. Separátní VirtualHost pro domena.cz a www.domena.cz
Použil jsem to 3. Jeho nevýhoda je ale v tom, že apache načítá 2x v podstatě tu samou konfiguraci virtualhostu a část spojení na backend bude držet domena.cz a část www.domena.cz. Předpokládám, že dobu, po kterou drží proxy spojení na backend určuje KeepAliveTimeout na backendu.
6.1.2016 22:52 alkoholik | skóre: 40 | blog: Alkoholik
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
A vazne ti to funguje? Apache totiz matchne worker pro https://webserver.domena.cz/ a je mu celkem jedno v kterem virtualhostu.
;)
Ten timeout je jeste vtipnejsi. ProxyPass ma timeout jako parametr. A kdyz neni mensi nez timeout na backendu, muzes dostat taky moc pekny race, kdy proxy tlaci data do spojeni, ktere backend uz zavrel.
7.1.2016 17:04 ap
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
Ano funguje. Mám takhle nastavených dalších 5 virtualhostů směřujících na https://webserver.domena.cz a také jedou bez problému.
7.1.2016 17:50 alkoholik | skóre: 40 | blog: Alkoholik
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
No je fakt, ze jsi nenapsal, na ktere verzi vlastne bezis. Uz je to nejaky patek, co se tohle fixovalo.
Jeste klikni na "Oznac jako reseni", at to ostatni uz nezkoumaji.
7.1.2016 19:22 ap
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
CentOS 7 / http 2.4.6. Ještě se jenom zeptám - je možnost zprovoznit toto v rámci jednoho virtuálu, něco jako If host je něco, pak používat tento proxypass? Vím, že httpd 2.4 má podporu if, ale netuším jak je to s kompatibilitou s mod_proxy.
8.1.2016 10:12 alkoholik | skóre: 40 | blog: Alkoholik
Rozbalit Rozbalit vše Re: Apache reverzní proxy má problém s SNI při redirectu
Ja mam na backendu hromadu virtualu pres subjectAltName v certifikatu a na frontendu worker pro kazdy extra. Finta je v tom, ze URL v ProxyPass musi byt ruzne, aby se pro apache netvarily jako jeden a ten samy.
S if by to teoreticky mohlo slapat i v ramci jednoho virtualu, ale to uz si vyzkousej sam.
Dalsi nedoporucene reseni je downgrade spojeni na backend na SSLv3, protoze tam zadne SNI mit nebudes. Mozna by to slo vnutit i TLS, ale nevim jak.
Na Tvem miste bych resil redirect uz na proxy.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.