a tleskám za něj.
A je štěstí, že tam to šifrování nakonec bude. Ono bez něj není nic jednoduššího, než poslouchat na jajně a při dotazu na server pushnout vlastní verzi nějakýho souboru... a najednou do stroje dojde nevyžádaný skript ve vyžádané komunikaci v souboru, na který se nikdo neptal.
Podle mě tady tvrdíte nesmysly.
Šifrování by mělo být čistě věcí rozhodnutí správce/provozovatele serveru. Proč by si prohlížeče měly vynucovat šifrování i v případě veřejných webů, kam se nikdo nepřihlašuje pomocí účtu a absolutně nehrozí ztráta dat? Bude z toho jen opruz se sháněním a správou certifikátů pro každou blbost...
Ono i celé HTTP/2 je poznamenané takovým tím aktivistickým extrémismem, podobně jako IPv6. Vůbec se nedivím, že se do toho vývojáři http serverů nehrnou a že se mnoha lidem nelíbí nahrazovat HTTP/1.1 binární sra.čkou. Dopadne to nejspíš tak, že se začnou objevovat nadšené aktivistické servery, hlásající do světa svoji pokrokovost vypnutím starých verzí HTTP :-) a zbytek dál dlouhou dobu pojede jako dřív. Pak - po létech - fanatici začnou prosazovat zákaz podpory starších verzí HTTP v prohlížečích - za velikého řevu pochopitelně.....
Nebude - servery přece při https svůj certifikát sami nabízejí. Spíš si lidi zvyknou automaticky odsouhlasit instalaci jakéhokoliv certifikátu.
Obávám se, že zákaz podpory starších verzí HTTP by měl podobný efekt, jako potenciální zákaz html tagů typu FONT, BGCOLOR, BGSOUND, B, I a dalších, které se stále hojně na webu vyskytují - pokud by se na ně výrobci prohlížečů (dnes tedy spíše integrovaných vývojových a běhových prostředí než prohlížečů) vykašlali, asi by uživatelé přešli k jiným, protože co je uživateli do toho, že daný tag je označený jako nedoporučovaný, že? Jedině, že by tyto tagy přestaly podporovat všechny prohlíče najednou, ale podle mě k takové dohodě není šance mezi výrobci prohlížečů dojít. A hrozba odlivu uživatelů je podle mě to, co podporu HTTP1 v prohlížečích zachová.
Měl jsem pochopitelně na mysli certifikáty serverů - ne uživatelské certifikáty...
Situace, kdy si na svém stroji udělám jednoduchý WWW server třeba pro sdílení free softwaru, statickou prezentaci, informační web třeba o modelařině... apod.. Už bych musel pořizovat certifikát od autority(self signed je řešením jen pro úzký okruh lidí), musel bych se starat o jeho životnost atd.... Přitom úplně zbytečně.
Takže vlastně chcete mít server ale nechcete se o něj starat ...
Od toho je hromada služeb, které vám nabízí si udělat prezentaci a o technické věci se postarají oni. Pokud se masivně rozšíří množství https webů, tak současně s tím vzroste tlak na věci jako DANE, tedy nebudete potřebovat autoritu, prostě ti tam strčíte ten váš selfsigned.
Já jsem nepsal nic o tom, že se nechci starat o server, ani to s mým komentářem nijak nesouvisí.
K šifrování HTTPS nejsou technologicky certifikační autority nutné. Když použijete DANE, můžete mít na webu klidně self-signed certifikát, který si klient ověří přes DNSSEC. Chybí "jen" podpora v prohlížečích.
Šifrované HTTP/2 bude na portu 80, šifrovaná komunikace na jiném portu byl historický omyl, upouští se od toho u všech protokolů. Ostatně ona celá nešifrovaná komunikace přes internet je omyl, i když pochopitelný.
psal, si "Když se bude vše šifrovat, je to jednodušší" - coz IMHO nelze takhle generalizovat - pro admina to jednodussi urcite nebude (bude must kvuli kazdemu "prdu" generovat/objednavat certifikat), nehlede na to ze 'Chybí "jen" podpora v prohlížečích', takze zbude (alespon z pocatku) jen volba certifikaty objednavat...
mno, nema cenu nad tim debatovat, rozhodnuto uz bylo (jen je IMHO skoda, ze jsme zbytecne prisli o dalsi volbu)
"pro admina to jednodussi urcite nebude"
Asi jak pro koho. Pro mě je mnohem jednodušší nastavit všude https a nic víc neřešit, než se potýkat se dvěma protokoly. Takže vhost pro http typicky obsahuje pouze redirect na https, a https si nastavím dle požadavků aplikace (+ třeba ještě navíc hsts). Případně http vůbec není nastavené a port 80 je nedostupný. Kdybych měl udržovat jak http tak https, měl bych to o něco složitější.
To neumí tvůj webserver automaticky? Konfigurovat dva identické virtualhosty je samozřejmě práce navíc.
U HTTPS je potřeba zajistit certifikát od nějaké CA. Pokud nemáš vlastní, kterou si můžeš naskriptovat, máš problém, protože málokterá má nějaké rozumné API. Možná by to mohl změnit takový ten projekt na automatické získávání DV certifikátů. Nebo DANE. Oboje je ale hudba budoucnosti.
typicky nebude problem na LANce, kde mas moznost korenace(rootCA) nainstalovat (nebo znas nekoho, kdo muze [intermediate pak muze posilat server, takze tam je to ve vetsine pripadu jedno]), problem je u webu poskytujici sluzby ven (typicky firemni web) - a trend poslednich nekolika let (at zije PR) je kvuli kazde sluzbe kupovat novou domenu (= koupit dalsi certifikat)
konfigurace vhostu bych nevidel jako velky problem, jelikoz to (v idealnim pripade) udelas jednou a jdes od toho
redirect na https - to je problem, protoze uz browser leakuje (ale mam za to, ze na mixed content browser upozornuje - i kdyz.... kdyz jsem videl Jenduv research na leak pres favicon, cert vi, co browser nakonec vsechno [ne]oznamuje )
> ale mam za to, ze na mixed content browser upozornuje
Už se mi nějak povedlo udělat, že neupozornil na blbý certifikát v mixed content a ten content nenačetl. Takže browser je potichu a stránka nefunguje, což se dobře ladí…
> i kdyz.... kdyz jsem videl Jenduv research na leak pres favicon, cert vi, co browser nakonec vsechno [ne]oznamuje
Je toho dost… Nejúžasnější mi přijde to Battery API.
> Co?
No přišlo mi, že tvrdíš, že je víc práce, protože musíš vždycky udělat dva vhosty, buď stejné (web s http i https) nebo ten jeden „dummy“ s přesměrováním (web jen s https). V Apachi nevím, v lighttpd se dá říct, že tenhle vhost je pro HTTP i HTTPS stejný a nemusí se to tam psát dvakrát, případně se dá říct, že má všechno přesměrovávat na https a pak nemusíš mít ty zvláštní přesměrovávací vhosty (to jde i v Apachi přes mod_rewrite).
Já nevidím jediný důvod, proč nešifrovat. Proč by si měl uživatel hlídat, kdy jeho prohlížeč má šifrovat a kdy nemusí? Podle mne je pro uživatele mnohem jednodušší, když prohlížeč prostě šifruje vždy. To samé u ostatních protokolů. Už aby bylo šifrované vše, pak si budeme vyprávět o tom, jak byly doby, kdy se na internetu běžně nešifrovalo, budeme si přitom klepat na čelo a divit se, proč to tak bylo.
Doufám, že když prohlížeče vyžadují šifrování pro HTTP/2, že také velice rychle zavedou podporu DANE. Pak nebude s certifikáty žádný problém.
Apache není jediný HTTP server. Těch "mnoho" lidí, kterým se nelíbí binární HTTP/2, by se mohlo dovzdělat, jak vypadá dnešní HTTP/1.1. Běžně se používá gzip komprese a chunked přenos dat, takže binární je to už dávno...
Jeden důvod bych viděl - šifrování znamená vyšší spotřebu energie. Údajně kvůli tomu ponechává Facebook standardní přístup nešifrovaný, kdo chce šifrovaný, musí si ho zapnout. Pokud by zapnuli šifrovaný přístup jako standard, možná by museli přikoupit i nové servery, ale i kdyby ne, spotřeba elektrické energie by jim narostla.
U statických stránek je možné mít na serveru jak nešifrovanou variantu stránky, tak zašifrovanou a nové šifrování provést až po změně obsahu originálního nešifrovaného souboru nebo v případě změny klíčů, u dynamicky generovaných stránek je nutné provést šifrování téměř vždy.
Když se na to podívám psychologicky - šifrování vs. nešifrování je také projevem toho, jak moc si jednotliví členové společnosti věří - takže až si budeme v době, kdy bude všechno šifrované, povídat o dobách, kdy se běžně nešifrovalo, možná to bude mít hořkou pachuť z toho "ano, v dávných dobách se nešifrovalo, protože lidé si navzájem věřili, že nebudou číst cizí data, a když si je náhodou přečtou, tak že je nezneužijí."
Že to tak nefunguje, ještě neznamená, že to tak fungovat nemůže. Nebo je nějaký důvod, proč by to tak fungovat nemohlo?
Podle mě je scénář typu:
- server dostane požadavek na šifrovaný přenos souboru,
- server se podívá, jestli už náhodou nemá zašifrovanou variantu souboru někde uloženou,
- pokud ji má, pošle ji jako odpověď,
- pokud ji nemá, provede šifrování originálního souboru, šifrovanou verzi si uloží a po té ji pošle jako odpověď.
Nevýhodou takového postupu je, že odposlechem lze +- zjistit, co uživatel v šifrované komunikaci provádí, protože mu chodí jednotné odpovědi - pořád stejný "rozsypaný čaj" :-)
Proto to protokoly neumožňují a klíč šifrování je vždy pro spojení náhodný a odeslaný bezpečným kanálem - asymetrickou šifrou.
Nevýhodou takového postupu je, že odposlechem lze +- zjistit, co uživatel v šifrované komunikaci provádí, protože mu chodí jednotné odpovědi - pořád stejný "rozsypaný čaj"
Pozor ... nechodí stále stejný rozsypaný čaj. V tom je právě ta krása moderních šifer, i pokud posíláte stále tu samou zprávu, tak po šifraci výstup vypadá jinak. V opačném případě by bylo velmi jednoduché odhalit šifrovací klíč, prostým předpokladem, jakou odpověď server vrací v daném "čaji".
> V opačném případě by bylo velmi jednoduché odhalit šifrovací klíč, prostým předpokladem, jakou odpověď server vrací v daném "čaji".
To jako fakt? Zašifroval jsem citovaný text pomocí openssl aes-256-cbc -in /tmp/foo -out /tmp/foo.enc
U2FsdGVkX1+/fGTG2+56ogZ+FKpdp5lpmtvYDNmy6pgmKAMsXspVP2VieTCalZdp2zwpgof3KFgy
s4S5VhAeC74wDibrsI53bc5lK+sWN4l/HpNFo1u4y735aKQuEeWc3mMkvLd9MbG4h44jdiRDiBXJ
yDRygNhzTINMTQmr58UwNwFMkfAS8NEvonSsXM4VhEeC07A09RuWYukbQzHjhNq1A+VcH+7KKnC1
lW4FD1g=
Nabízím 10 mBTC za program, který najde použitý klíč na běžném počítači (tj. ne bruteforce a podobné náročné útoky).
a) nejsme ve sporu v tom, jak teď šifrované spojení funguje - tj. vždy se šifruje znovu a nikdy neposíláte stejný zašifrovaný text
b) reagoval jsem na předšifrované soubory na serveru - které by se takto nechovaly a měly by tak slabinu, že bude informace "prosakovat" ven
c) odhalit šifrovací klíč jen z zašifrované zprávy a známé šifrované zprávy - to lze u primitivních "parodií na šifrování" typu xor. U kvalitní šifry by to mělo být velmi obtížné - rozhodně je to ale pomůcka při lámání šifry, obzvláště, pokud je těch zpráv více.
U "předšifrovaného" obsahu není co lámat. Takový server by musel používat vždy jen jeden klíč pro zašifrování a tedy i na dešifrování by stačila znalost jediného klíče, který by pochopitelně musel server protistraně prozradit. Je to tedy naprosto nesmyslný koncept. Bohužel mě nenapadá vhodný příměr, na kterém by se dala absurdita tohoto návrhu ilustrovat.
Každé spojení, i v rámci jednoho serveru, je šifrované jiným klíčem, takže stejná data proudí k různým příjemcům různě zakódovaná. Možnost, že by se jednou zakódovaná data dala znovu použít, je tak zcela zanedbatelná. Pokud by se veškerý provoz šifroval stejným klíčem, pak by takové šifrování dost citelně ztrácelo smysl. :-)
Adam Langley vydal už v roce 2010 na svém blogu článek: Overclocking SSL, kde se vyjadřuje k tomu, jak moc SSL zatíží servery a není to založeno na dojmologii.
Váš poslední odstavec je přesně příkladem toho, jak se přemýšlelo dříve při návrhu protokolů. Bohužel toto myšlení bylo v post-Snowden světě překonáno bez ohledu na to, jestli se všechno šifruje nebo ne. Naopak je zapotřebí šifrovat úplně všechno.
Zmíněný článek se ovšem zabývá výpočetní náročností, nikoliv energetickou náročností.
Kromě toho je ale i ten poslední odstavec ukázkou směru, kam se vyvíjí důvěra ostatním lidem - a nejde nic jiného, než si povzdechnout, že stav společnosti je v tomto smyslu opravdu žalostný.
Řeší snad teď ti lidé, jaký mají mít server, kam ho mají umístit, jak nakonfigurovat DNS? Neřeší, nakoupí prostě webhosting jako službu. Není jediný důvod, proč by součástí té služby nemohl být certifikát.
K čemu to bude už jsem psal. Nemusíte řešit dva protokoly, když stačí jeden, uživatel nemusí hlídat, zda je na šifrovaném nebo nešifrovaném spojení, neexistují útoky spočívající ve vnucení nešifrovaného spojení. Komunikace na internetu zkrátka může být snadno odposlouchávána, takže by veškeré komunikace měla být šifrovaná. A nevyplatí se plýtvat energií lidí na to, aby vymýšleli nešifrované varianty protokolů, a aby řešili, kdy šifrování opravdu není potřeba.
Představte si, že jsou lidé, kteří mají svoji doménu i svůj server - ať už fyzický nebo virtuální. A neprovozují to v žádném obrovském hostingovém centru.
Vy už pod vlivem Googlu a podobných zapomínáte na původní decentralizovaný smysl Internetu. Prostě vám Internet ukradli a ani jste si toho nevšiml.
Představovat si to nepotřebuju, protože vlastní doménu i vlastní server mám. A zrovna minulý týden jsem do jedné aplikace naprogramoval výměnu HTTPS certifikátu přes webové administrační rozhraní - jenom přetáhnete soubor s privátním klíčem do okna prohlížeče a zadáte heslo. Takže vím, že správa HTTPS serveru není žádná raketová věda.
Věda to opravdu není.
Jen to obvykle není zdarma a vyžaduje to pozornost, bez které nastávají problémy.
U spousty aplikací úplně zbytečně.
___
Mimochodem zkuste třeba implementovat šifrované HTTP/2 na 8 bitovém Atmelu, který pro vás dělá dejme tomu telemetrii, dostupnou přes WWW browser v situaci, kdy takový browser nic jiného neumí(což je nejspíš sen bláznivých aktivistů).
Já vím, zakážeme používat 8 bitové Atmely, protože nejsou cool....
Zdarma to klidně být může. Pozornost vyžaduje i správa serveru, vyžaduje jí i vlastnictví domény. Pokud to někdo nezvládá, ať si na to někoho najme.
Přistupovat k tomu Atmelu přímo z prohlížeče není dobrý nápad ani v případě nešifrovaného HTTP. Na to, abyste na ten Atmel udělal DoS, by vám pravděpodobně ten jeden prohlížeč stačil.
Na takovou debatu už vážně nemám....nervy.
Proč si přidělávat další starost při správě serveru, není - li nutná?
Proč bych, proboha, tu svoji telemetrii vystavoval do veřejného internetu? Chci to mít na své privátní síti, ale už mám na PC(hypoteticky) pouze zkriplené prohlížeče bez podpory HTTP <= 1.1 - takže bez šance.
Takových Atmelů s pidi http serverem běží, že byste se divil...
No, k tomuhle jsem měl udělanou "komunikační kartu na SPI" s AT91SAM7X256 + LAN8700I. Kromě LAN uměla i RS232, RS458, CAN a USB Device.
Stačilo by přepájet procesor za AT91SAM7XE256, použít v něm ten hardwarový šifrovací modul navíc a je to hotovo i s jednou rukou v poklopci... A odstřelení sítě navíc neshodí hlavní procesor.
Bude to zataz servera to pripustam, ale co ked o mna maju zaujem tajne sluzby lebo maju podozrenie ze som Anonymus a vedia ze si pozeram hviezdy na Vasej stranke. Ak sa nic nebude sifrovat tak mi do komunikacie mozu nieco pekne pribalit. Dokonca stranka s hviezdami krora ma 100 navstevnikov denne a fotky sa nacitavaju urcitu dobu bede pre tento utok idealna.
Ve spojení s projektem Let's Encrypt to nevnímám jako problém, právě naopak.
Ostatně nechápu (resp. trochu se v IETF vyznám, takže tomu rozumím), že ve světle RFC 7258: Pervasive Monitoring Is an Attack se provedlo protokol, který nemá povinné šifrování protlačit přes WGLC a IESG.
Naopak se ukazuje, že nedostatek šifrování (a autentizace stran komunikace) ve starších protokolech je jeden z hlavních problémů dnešního Internetu z pohledu zabezpečení soukromí.
P.S.: Kde jste byl, když se nahrazoval plain-text telnet tou šifrovanou binární sra.čkou nazvanou SSH.
Přesně o tom jsem psal a očekával to. Teď se vyrojí aktivisté, kteří budou překrucovat, dezinterpretovat, útočit.... :-) Je to vždy a znovu legrační.
Dobře víte, že šifrování nijak příliš nesouvisí s tím, jak vypadá vlastní protokol, který je jím obalený.
SSH je přesně ten případ, kdy bylo zavedení šifrování velmi rozumné a žádoucí. Byl zaveden tam, kde před tím žádné odpovídající řešení nebylo k dispozici. Plus poskytl další užitečné vlastnosti navíc.
Snahy o kompletní šifrování webu a s tím spojený marketing běžným uživatelům poskytnou hlavně pocit falešného "absolutního" bezpečí. Lidem, které prd zajímá co to vlastně je certifikát, není až takový problém nějaký podstrčit. Jak praxe ukazuje, už si takové "řešení" dokonce mohou koupit s novým PC.
Ale nebojte. Časem to prosadíte a svět bude celý sluníčkový.
Ony se jaksi "tak ňák" obvykle používají ruku v ruce a na Webu nemá jeden bez druhého moc velký smysl.
Ale jo... narveme TLS úplně všude. Časem můžeme šifrovat i ručně psané poznámky na papíře....Řešení se najde.
______
Nebezpečím pro soukromí nejsou nešifrované veřejné Weby bez osobních dat. Fatálním průserem jsou z tohoto pohledu záležitosti jménem Google, Facebook, smartphony, prolezlé spywarem už přímo od výrobce a další podobné vymoženosti. Ty vám zjevně nevadí. Taky názor.
Mozilla? Na to nemaj cas, musej zavadet novy pole pro vyhledavani, rusit matouci volby v about:config ... jo samo ta audio hruza
https://bugzilla.mozilla.org/show_bug.cgi?id=14328
Mozna se za pristich 30let dockas. Sak jeste porad neumej v html5 ani youtube.
Výborný nápad. Až na to, že by bylo nějak potřeba ověřit, že podpis vytvořil ten, kdo ho vytvořit měl. Takže bychom tu měli krásně spojené nevýhody obou protokolů – otevřený text jako v HTTP a zároveň starosti s certifikáty jako v HTTPS. Není divu, že takový způsob přenosu ještě nikdo neimplementoval :)
Co brání HW akceleraci? Těch pár tisíc tranzistorů už se na čipech při jejich komplexnosti ztratí.
Už i jednočipy mají periferku, do které z jedné strany sypete data a z druhé leze šifra. Spotřeba je na zlomku toho, co by vzalo jádro. Procesor se toho vůbec nemusí účastnit...
Používal jsem je např. na AT91, MSP430, STM32,...
A máte tu spotřebu energie změřenou? A to navíc v době, kdy je AES-NI v každém procesoru a zvládá ušifrovat gigabajty za sekundu? Nehledě na to, že existují HW akcelerátory.
Pokud argumentujete spotřebovanou energií, tak byste se spíše měl zaměřit na to, proč ty weby vůbec existují a zda by nebylo nejlepší ty servery rovnou vypnout. Ušetří se tak daleko víc než pár mWh.
Vůbec nepŕestřelil.
https://www.overclockers.at/files/i7980x_tc_160714.png
Většina procesorů, má implementovanou AES-NI instrukční sadu, takže šifrování a dešifrování je opravdu rychlé.
Oproti tomu šifrování a hlavně dešifrování je u asymetrických šifer třeba až 200 náročnější ve srovnání se symetrickými šiframi.
Symetrické šifry lze snadno akcelerovat, protože většina operací, které se provádí jsou XOR, AND, OR, bitové posuvy, rotace, atd.
Asymetrické šifry akcelerovat nelze. Operace nejsou triviální, pracuje se například s čísly s délkou 600 někdy i 1200 číslic.
Já jsem reagoval čistě na původní příspěvek, který vypadá, jako kdyby AES-NI byl v každém procesoru (což není pravda) a ve všech, kde je, podával uvedené výkony (taktéž není pravda).
Již několik let se s vydáváním nových procesorů snažím najít řešení, které by bylo schopné v bezventilátorovém provedení ušifrovat aspoň 100mbit vpn a marně. V poslední době se začíná situace trošku zlepšovat (např. Zotac CI540), ale konzumní SOHO zařízení toto prostě nezvládají.
Pokud původní příspěvek vezmeme v kontextu vlákna a prohlásíme, že šlo o serverové procesory, pak ok, tam je AES-NI s uvedeným výkonem poměrně standard.
No já jsem reagoval na spotřebu onoho šifrování. Oxymoron tady 3x napsal, jak šifrování zvýší příkon, což, vzhledem k tomu, jakých rychlostí ty procesory dosahují (řádově gigabajty /s) a vhledem k velikosti jedné webové stránky (řádově stovky kB) by představovalo zvýšení spotřeby v řádu mWh. Jistě existují lepší způsoby, jak snížit příkon datacenter o celé MWh. Netřeba řešit jednotlivé mWh.
Bonus je, že není nutné podepisovat transportní kanál. Místo toho by se dal podepisovat obsah. Když si z nějakého obskurního mirroru stáhnu instalačku operačního systému, je mi úplně jedno, že si někdo jiný může přečíst obsah přenášených dat. Důležité je, aby obsah nemohl nikdo změnit, ani správce serveru. To mi TLS nezajistí. Sice si můžu z nějakého důvěryhodného zdroje stáhnout a zkontrolovat checksum, nebo GnuPG podpis, ale nějaký standardizovaný mechanismus, kterým by browser zkontroloval integritu automaticky, by byl užitečný.
Server se klientovi autentizuje svým certifikátem, potažmo důkazem vlastnictví privátního klíče. Celá komunikace je šifrovaná. Cokoli tam přidat, ať už to je skript, obrázek nebo jedno jediné písmeno je vyloučeno.
MITM na komunikaci šifrovanou TLS lze dělat, ale na klientově počítači musí být podvržený certifikát.
>nejspíš bude self-signed.
Nemyslím si. Pokud si někdo doménu hostuje, tak bude bombardovat helpdesk hostera dotazy, proč se mu při přístupu na jeho stránku zobrazuje varování.
Firemní weby si to certifikáty zařídí, v tom není problém a ti, co si spravují webserver sami by měli také. Cena za certifikát není kdovíjak velká pálka a když je někdo kolenovrt, tak si zařídí free certifikát.
Aby se uživatelům zobrazovalo při každé návštěvě varování, to je sebevražda. Na tu stránku nikdo nebude chodit.
To že je HTTP/2 binární by mi tolik nevadilo, vždyť všichni stejně používají knihovny. Ale to skoro-vynucení šifrování mi přijde trochu nešťastné z důvodu nároků na CPU. Je fajn, že o něco zkrátíme headery, a tím ušetříme za hosting. K čemu to ale je, když nám server sežere o hodně víc CPU? Samozřejmě nutnost platit za certifikát také nepotěší.
Šifrování není vynucené ani skorovynucené, v protokolu je nakonec dobrovolné. Pokud nakonec tvůrci prohlížečů budou tento protokol podporovat jen v šifrované variantě, je to jejich rozhodnutí, autoři protokolu s tím těžko něco udělají. (Osobně si myslím, že to rozhodnutí autorů prohlížečů je správné, a autoři specifikace měli být tvrdší, v protokolu šifrování vynutit a zároveň v protokolu určit, že klient musí povinně podporovat DANE). Tím, že server sežere o hodně víc CPU, jste si jist? Za certifikát platit nemusíte.
Ad za certifikát platit nemusíte - pro komerční účely ano. Představte si všechny firmy, které mají web. I RapidSSL si účtuje 49 USD za rok za single domain, a 199 USD za rok za wildcard certificate. Proč by to ale měla platit firma, která má na webu ceník hřebíků nebo zahradních prací? Pro certifikační autority je to jistě super business.
Ad server sežere o hodně víc CPU, jste si jist - samozřejmě že šifrování dat není z hlediska výkonu zadarmo, a to ani když máte HW akceleraci (AES-NI). Podle starších testů se vytížení CPU zvýší troj- až čtyřnásobně. Navíc se prodlouží handshake, protože se zvýší počet round tripů.
Ne, za certifikát opravdu platit nemusíte. Za posledních čtrnáct dní jsem vytvořil asi 6 certifikátů, a neplatil jsem vůbec nic. Placené jsou pouze certifikáty vydávané většinou certifikačních autorit.
To, že šifrování není z hlediska výkonu zadarmo, neznamená, že se zvýší spotřeba nebo sníží výkon. Ono z hlediska výkonu není zadarmo ani to, když procesor nic nedělá. Handshake se sice prodlouží, ale zase ho uděláte jenom jednou a pak všechno běží jedním spojením – na rozdíl od HTTP/1.1, kde si prohlížeč otevře třeba 20 spojení na jeden server.
Ad za posledních čtrnáct dní jsem vytvořil asi 6 certifikátů, a neplatil jsem vůbec nic - self-signed certificate je na webu jaksi na nic.
Ad To, že šifrování není z hlediska výkonu zadarmo, neznamená, že se zvýší spotřeba nebo sníží výkon - v jedné variantě děláte prakticky jen posunutí bufferu z paměti na síť, v druhé variantě musíte provádět šifrování. Samozřejmě druhá varianta musí mít vyšší vytížení CPU i spotřebu.
Ad Handshake se ... uděláte jenom jednou a pak všechno běží jedním spojením – na rozdíl od HTTP/1.1 - souhlas, oproti HTTP/1.1 je to lepší varianta. Ovšem šifrované HTTP/2 proti nešifrovanému je nutně horší.
Nechápejte mě špatně. Šifrované spojení je důležité v dlouhé řadě případů, o tom není žádného sporu. Ale nějak mi uniká důvod zbytečně (a opakovaně) platit za certifikáty, zvyšovat zatížení a spotřebu serverů a prodlužovat odezvu serverů, pokud na daném webu nejsou citlivé informace.
Osobně vidím dva důvody, proč by někdo mohl chtít šifrování vždy a všude:
1. Je to skvělý business pro certifikační autority. Tohle bude bohužel zřejmě primární důvod.
2. Aktivisté se domnívají, že když se bude šifrovat všechno a všude, tak budou mít vlády víc problémů se šmírováním. Jenže to zaplatí vlastníci těch pár set milionů domén, které budou potřebovat placené certifikáty.
Nutnost platit za certifikáty je pouze váš výmysl, způsobený zřejmě tím, že současný nejčastější způsob řešení považujete za jedinou možnost. Není to jediná možnost, a já nevěřím tomu, že v době, kdy se HTTP/2 rozšíří a servery ho budou běžně podporovat, se bude za DV certifikáty platit. Že to zvyšuje zatížení a spotřebu a prodlužuje odezvu serverů je opět vaše ničím nepodložená spekulace.
Mimochodem, jedním z lídrů zavádění HTTPS je Google, který už dávno zapnul HTTPS jako výchozí i pro takové služby, jako vyhledávání, kde jsou jen samé veřejné informace. Zároveň Google vytvořil SPDY, předchůdce HTTP/2, který existuje jen v šifrované variantě, a řeší právě tu prodlevu před zobrazením stránky. Nepodezříval bych Google, že když vytvořili vlastní protokol, nenapadlo je jenom nezapínat HTTPS, ani bych ho nepodezříval, že se stará o byznys certifikačních autorit.
Nesouhlasím ani s prvním ani s druhým vašim důvodem, pro mne je důvod jednoduchý - proč nešifrovat, když je to tak snadné, a aspoň se pak nemusím starat o to, kdy šifrovat a kdy to není nutné. Navíc tím odpadnou všechny bezpečnostní problémy způsobené tím, že se nešifruje tam, kde by se šifrovat mělo (třeba protože se útočníkovi podaří šifrování vypnout).
Jak už jsem psal, vlastníci pár set milionů domén nebudou potřebovat placené certifikáty. Naopak, potřeba placených certifikátů bude menší, než dnes, většina webů vystačí s neplacenými DV certifikáty.
Jak jsem psal, kryptografické operace nejsou zadarmo. Není to doměnka, je to prostý fakt. Samozřejmě je to možné doložit čísly:
První z Windows. SSL code path je cca 10x-15x delší než non-SSL. Při requestu na 30 bytů je SSL 7x pomalejší, při 36kB 6x pomalejší, při 1MB 6x pomalejší, vizte tabulku 2. V tabulce 4 můžete vidět skoro 10x pomalejší první odpověď na request.
http://spirit.cs.ucdavis.edu/pubs/conf/iccd00.pdf
Zde simulace provozu na Amazon.com, na obrázku 8 vidíte, že Apache je s TLS 3x-5x pomalejší.
http://www.cs.rice.edu/~dwallach/pub/tls-tocs.pdf
Nyní OpenSSL. Nevidím tam porovnání se stavem bez SSL, ale jen rozdíl mezi RC4 a AES je cca čtyřnásobný. "It turns out that about 70% of the total processing time of an HTTPS transaction is spent in SSL processing."
www.cs.ucr.edu/~bhuyan/papers/ssl.pdf
Samozřejmě doba pokročila, procesory se zrychlily, kód byl optimalizován. Ale princip zůstává, a kryptografické operace nadále stojí spoustu cyklů CPU; to jen tak nezměníte.
Přitom na rychlosti odpovědi serveru dost záleží. Podle Googlu 500ms zpoždění odpovědi vede ke 20% poklesu provozu. Podle Amazonu už 100ms zpoždění vede k poklesu tržeb o 1%.
https://sites.google.com/site/glinden/Home/StanfordDataMining.2006-11-29.ppt
Ad vlastníci pár set milionů domén nebudou potřebovat placené certifikáty - a jaké jsou alternativy?
Pokud ale prohlížeč usoudí, že nevyžádaný skript nepotřebuje, tak jej přece nepoužije.
Server bude (chtít) poskytovat jen nevyžádané skripty, které bude očekávat, že prohlížeč nemá (stejně bude mít většinu v cache).
Prohlížeč si prostě začne parsovat načítanou stránku a když tam bude odkaz na jiný soubor, tak se jen podívá - "nemám už tohle náhodou?" a pokud ano, tak to použije (na správném místě) a pokud ne, tak si to vyžádá (pokud už není ve fázi stahování).
Omlouvám se všem za možné nepřesnosti, standard jsem moc nestudoval, ale mám dojem, že se to snad ani jinak napsat nedá :-)
Je tady několik věcí:
- pokud server bude posílat automaticky nějaké soubory navíc, o kterých pak prohlížeč usoudí, že je nepotřebuje, je to trochu v rozporu s tím, že to má šetřit provoz na síti,
- aby server mohl přilepovat k požadavku prohlížeče potenciálně potřebné soubory musí buď parsovat danou stránku a vyzobávat z ní odkazy na tyto soubory nebo by musel mít pomocný soubor se seznamem, které soubory má k odpovědi přilepovat,
- aby mohl server přilepovat výhradně ty soubory, které ještě prohlížeči neposlal, musel by si udržovat databázi, které soubory na kterou IP adresu už poslal a které nikoliv a také by se mu hodila informace o tom, jestli prohlížeč má daný soubor stále v cache, či už ji smazal - první varianta potenciálně vede na obrovské databáze, druhou informaci pokud vím prohlížeče neposílají.
Chtělo by to méně spekulovat a více o tom vědět... Ale to je dávno zapomenuté umění, že? A nemusíte číst ani standard:
Nine Things to Expect from HTTP/2 bod 4, poslední odstavec:
Of course, in some situations, the client doesn’t want something pushed to it — usually because it already has a copy, or knows it won’t use it. In these cases, it can just say “no” with RST_STREAM (see below).
No ja vidim tricetidenni cachovani napr. u:
http://f.root.cz/webtemp/cssloader-2ee7f0142e56.css?t=1424377181
Cache-Control:max-age=2592000
Date:Fri, 27 Feb 2015 08:07:03 GMT
Expires:Sun, 29 Mar 2015 08:07:03 GMT
Last-Modified:Thu, 19 Feb 2015 20:20:09 GMT
Nechapu, ze se vam zda divne, ze se HTML, ktere se u takoveho webu meni prakticky s kazdym nactenim (a jedna se radove o kilobajty), necachuje v prohlizeci.
Chtelo by to nezvanit hovadiny a podivat se do reality .... tych webov nie je 100% a nebude ich ani 75% a ani 50%.
Napriklad len tento rok nasa firma vypustila do sveta okolo 150 webov a na ziadnom z nich nebolo no-cache.
Dalej presiel som si cca 10 mnou najpouzivanejsich webov, medzi ktore patria z velkej casti aj celosvetovo pouzivane weby a ziaden z nich nema no-cache.
Okrem toho prave kvoli cache sa zaviedli odporucania pre webdeveloperov aby do cesty k CSS a JS suborom pripajali aj parameter s cislom verzie - aby ta nova bola prehliadacom stiahnuta.
Takze tolko k tvojej no-cache realite...
Ach jo, programoval jsi někdy web? V zásadě máš 2 možnosti:
- použít standardní HTTP přístup s Last-Modified apod. Klienti se pak poměrně často (na základě nějakých refresh intervalů, které jdou nastavit v hlavičce) snaží přečíst danou adresu a případně dostane odpověď Not modified. Máš 2 varianty: buď nastavit ten refresh interval na 0, takže klient se toho zdroje ptá pokaždé (takže se sice zdroj nenačítá, ale latence se počítá), nebo na něco vyššího, jenže potom se změna neprojeví klientům ihned.
- udělat výše uvedený postup pouze na hlavní stránce s refresh intervalem 0, ale do veškerých zdrojů přidat někam do cesty datum (nebo jako parametr přes ?číslo). Na zdroje potom můžeš udělat Expire:nekonečno. Výhody oproti předchozímu řešení: minimalizuješ přístup browseru na ostatní zdroje (nemusíš validovat), případná změna zdroje je přístupná všem klientům ihned.
Co že jsi to psal o břídilech?
Cece, ty asi nemas ani paru jak to funguje, ze? Browser, kdyz neco nacita, tak se podiva do cache, tam ma mimo jine napsano, kdy to tam ulozil (pripadne casy z hlavicek), a presne tohle posle serveru, kterej mu nasledne bud odpovi, ze ma aktualni data a tudiz nic nestahuje nebo mu odpovi, ze na serveru jsou data novsi a pak se sosnou.
Browser se sam o sobe o nic a nikdy nesnazi, akci vzdycky vyvola uzivatel. Pokud samo pominu vsemozny js sracky.
Dokonce uz drahne let se da pouzivat ETag
=> dalsi bridil, presne jak sem psal.
Můžete to napsat tisíckrát špatně, ale stejně se z toho pravda nestane. Pokud prohlížeč funguje podle RFC, nezdržuje vykreslování stránky tím, že by se dotazoval server na objekty, které má v cache a jsou čerstvé. Ostatně, pro nejrozšířenější prohlížeče existují vývojářské nástroje, kde můžete HTTP komunikaci sledovat. Tam uvidíte, že u dobře napsané stránky prohlížeč spoustu souborů použije z cache a serveru se vůbec nedotazuje.
RFC 7234 – HTTP/1.1: Caching
4.2 Freshness
When a response is "fresh" in the cache, it can be used to satisfy subsequent requests without contacting the origin server, thereby improving efficiency.
Že vy si na ty vidle pokaždé naběhnete s takovým rozběhem.
Připomínám, že se celou dobu bavíme o případu, kdy autor webu chce, aby některé objekty byly kešovány, klient se na ně serveru vůbec nedotazoval a ušetřil se tím čas jinak nutný ke kolečku dotaz–odpověď.
Jenže toto se dělá blbě bez nějakého verzování nebo assets fingerprinting. Pokud nepromítnu nějaké verzování do URL assetů, pak:
a) nastavím must-revalidate, pak ale neušetřím round-trip, nebo
b) nebudu požadovat revalidaci – pak riskuju, že dostanu třeba staré CSS pro nový HTML markup (true story)
Dávat verzování do URL sice není úplně ideální, ale řeší mi to tento problém. Nemusím vyžadovat revalidaci a klient může třeba následující rok brát CSSko bez obav z cache a nemusí se serveru na nic ptát. Jakmile CSSko aktualizuju, změní se jeho URL a klient si stáhne novou verzi. Jediný problém s tímto mechanismem je, že zbytečně zůstává u klienta stará verze v cache. Bylo by fajn, kdyby nová verze vyhodila z cache všechny staré. (Hmm, možná to půjde ohackovat přes pushnutí staré verze s expires v minulosti, ale i pokud to bude fungovat (nejsem si jistý), přinese to různé praktické problémy…)
Možná to takto půjde (nicméně nepůjde takto řešit načítání stránky během updatu serveru), ale nevím. Pokud by CSSko mělo must-revalidate, potom HTTP/2 moc nepomůže. (Jen při prvním requestu.) Pokud nebude mít must-revalidate a bude mít dlouhou expiraci, je potom otázka, co udělá prohlížeč s pushnutým souborem – jestli ho automaticky nezahodí.
Navíc toto řešení není kompatibilní se starou verzí protokolu, takže pro HTTP/1 by se muselo použít jiné řešení. Vyvíjet dvě různá řešení pro dvě různé verze protokolu a testovat obě varianty je IMHO zbytečně náročné – já bych radši použil prostě fingerprinting a bylo by.
Nejsem si jist, jestli je to určeno i pro tento scénář, navíc to může být problematické a náchylné na chyby v implementaci na konkrétním webu a neodolné vůči chybám při přenosu. Rozvedu to:
Scénář, na který to bylo připravené, je spekulativní stažení souborů, které prohlížeč ještě nemá nacacheované. Taky to je připravené odmítnout soubory, které prohlížeč už nacacheované má. Pokud ale server pošle prohlížeči soubor, který už nacacheovaný má, ale má jinou expiraci, nevím, co s tím prohlížeč udělá (co když to odmítne ještě před přečtením všech hlaviček?), ani jestli se tím specifikace zabývá.
Udělat to dobře a udržet to aktuální je taky náročné. Znamená to udržovat nebo nějak získávat separátně nějaký seznam připojených souborů. A pokud to udělá špatně, což při úpravách není až tak těžké, tak si toho nemusí všimnout a může se to projevit třeba až v produkci náhodně některým uživatelům – třeba podle toho, v jakém pořadí procházejí stránky.
Pokud dojde k chybě při přenosu (nebo třeba útočník úmyslně odstřelí připojení ve vhodnou chvíli – může ji odhadnout podle objemu přenesených dat apod.), může se stát, že část assetů se invaliduje a část ne. Pokud se pak podívám na nějakou část webu zcela z cache, bude to rozbité. (Vím, že toto je možná trošku edge case, ale chci ukázat, že to má problémy.)
Naproti tomu assets fingeprinting je docela fool proof. Pokud ho udělám na svém webu špatně, pak to nebude fungovat (všimnu si hned), nebo se použije fallback na neverzovanou variantu, která se cachuje s must-revalidate (pak to bude fungovat, akorát to bude mít zbytečně větší latenci). Mám podporu ve frameworcích (aspoň Play! a RoR). Není potřeba mít redundantní seznam potřebných assetů. Funguje to i se staršími verzemi prohlížečů (nemusím pro ně vymýšlet nějaké extra řešení nebo dělat nepříjemný fallback na must-revalidate). Lze zajistit i to, aby v případě update webu během načítání stránky se web načetl správně. (Prostě si budu chvilku ještě pamatovat staré assety na starých URL.) A pokud budu chtít pro lidi s prohlížeči s HTTP/2 zrychlit první načtení stránky, mám stále tu možnost. Sice je to další práce, ale už není tak náchylná na chybu a není nutné vždy řešit všechny assety. Pokud na něco z toho zapomenu, jen se zvýší latence. A v některých případech (neblokující assety dole na stránce) to ani nebude moc vadit.
V FAQ je přímo jako jeden z rozdílů oproti HTTP/1.1 uvedeno allows servers to “push” responses proactively into client caches. Na implementaci by to nemělo být nijak složité, jediný rozdíl je v tom, že zaslání objektu iniciuje server, dál už se to celé chová úplně stejně, jako by klient poslal požadavek a dostal na něj odpověď.
To, jak se to implementuje na serveru, s kešováním nesouvisí – je potřeba to udělat správně, ať už se to bude používat pro vynucení obnovy cache nebo ne. Jinak získávání seznamu souborů, které se mají pushnout ze serveru, nemusí být nijak složité a může to dělat HTTP server automaticky – třeba v Jetty si můžete zapnout, že si podle refererů sestaví seznam objektů, které patří k dané stránce, sám (ale zrovna při větších úpravách stránky by tahle strategie nefungovala).
Já netvrdím, že se server push bude v budoucnosti používat jako jediný způsob pro výměnu objektů v cache, třeba se objeví problémy, kvůli kterým se to nebude používat vůbec (třeba bude moc klientů, kteří server push budou vypínat). Oproti verzování to ale má tu výhodu, že se cache prohlížeče neplní starými nepoužívanými objekty. Navíc při verzování se myslím obvykle verzuje celý web (je to jednodušší), takže se do cache pod novým číslem verze stahují i ty objekty, které se nijak nezměnily. Při použití server push prostě server nabídne všechny objekty v aktuální verzi, a klient si z nich vybere ty, které ještě v cache nemá.
Zkrátka jde o to, že server push je nová možnost, jak obnovit objekty v cache prohlížeče (pokud prohlížeč server push nezakáže), a pokud server posílá k požadavku na stránku ty správné objekty, získáte vlastně obnovu souborů v cache zadarmo jako vedlejší efekt.
Z toho jsem ale nevyčetl, jestli prohlížeč může/musí/nesmí odmítnout soubor, který má už v cache bez must-revalidate.
Ano, tak jako tak je to potřeba udělat správně, ale pokud na tom bude záviset invalidace cache, jsou nároky vyšší. Pokud mi na tom nezávidí invalidace cache, prostě se postarám o to nejdůležitější (blokující prvky jako CSS a JS a případně některé důležité obrázky) a zbytek až tak moc řešit nemusím. A pokud na něco zapomenu, nenastane takový problém.
Nemusí se verzovat celý web a ani Play! (nebo spíš SBT Web) ani RoR to tak nedělají. Typicky se přidává hash do cesty.
Ano, řešilo by se tím mazání starých verzí z cache, ale za ty problémy s tím spojené to IMHO nebude stát. Hádám, že se spíše reálně dočkáme podpory invalidace starých verzí souboru v HTTP/3, třeba hlavičkou Fingerprint-convention, která by specifikovala pořadí fingerprintu a původního názvu souboru. (Různé frameworky to pojmenovávají různě – soubor global.css bude třeba global-908e25f4bf641868d8683022a5b62f54.css v RoR, ale 908e25f4bf641868d8683022a5b62f54-global.css v Play!. Těch možností asi až tolik není, možná by stačily dvě nebo tři varianty.)
Prohlížeč může odmítnout kterýkoli soubor. Ale byl by nesmysl, aby podle hlaviček novější soubor odmítl. To by bylo, jako kdyby poslal požadavek s If-Modified-Since, server mu poslal 200 s novým souborem, a prohlížeč by pak odpověď stejně ignoroval a použil starou verzi z cache.
To přidávání otisku do URL a navíc přímo do cesty odporuje sémantice URL. Pochybuju, že by se něco takového dostalo do HTTP standardu (leda tak do HTML5).
Pokud není must-revalidate, prohlížeč by mohl odmítnout dřív, než mu vůbec dojdou hlavičky.
Otisk v URL proti sémantice – proč? Chci ten a ten soubor té a té verze. Dělá se to třeba na https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js . Otisk je pouze jiné řešení čísla verze. (Pravda, z otisku nelze soudit, co je novější a co starší, ale to až tak nevadí.)
Neměl by to odmítnout dřív, protože bez hlaviček nemá dost informací, aby to odmítl.
URL odkazuje na nějaký zdroj nebo dokument. Obsah toho zdroje se v čase může vyvíjet (to jsou ty verze), ale URL zůstává pořád stejné. Aktuální verze vyhledávače Google je na www.google.com a neřeším, že bych chtěl nějakou jinou verzi. Podobně chci, aby se mi ke stránce stáhnul aktuální stylopis, nechci žádnou konkrétní verzi - verze je pouze implementační detail a do URL se dává spíš proto, aby si autor webu usnadnil práci.
„Neměl by to odmítnout dřív, protože bez hlaviček nemá dost informací, aby to odmítl.“
Prohlížeče s HTTP/1 musejí rozhodovat o cacheování (aspoň částečně) už na základě URL a obsahu cache. Podle toho se rozhodnou, zda a případně jak se budou ptát serveru. Může být přímočařejší a konzistentnější se o případném odmítnutí pushnutého souboru rozhodnout už na základě obdržené URL.
Ale asi nemá moc smysl debatovat o tom, co by bylo lepší. Já nemám moc čas si toto teď dohledávat ve standardu. Pokud k tomu máte nějakou citaci standardu nebo nějakého autoritativního zdroje (třeba blogpost nějakého významného implementátora HTTP/2), bude to jasné. Jinak to budou (oboustranně) spíše dojmy a „já bych to udělal takto“.
Někde se verze v URL hodí, někde ne. Pokud vím, tak sémantika URL to nezakazuje ani nepřikazuje. Třeba u zmíněného JQuery na CDN se verze uvádí – CDN hostuje několik různých verzí a potřebuje vědět, kterou má vrátit. A není to implementační detail, je to přímo požadavek, kterým říkám, co přesně chci. U homepage Googlu se tato sémantika nehodí, není moc důvod chtít rok starou verzi. Assety webu jsou někde trošku mezi – typicky nepotřebuju poskytovat dvě verze tak dlouho jako u JQuery CDN, ale chvilku (během updatu na novou verzi) se to může hodit a systém cacheování v tom nemá moc šanci pomoci, leda s nějakými hodně low level hacky.
OK. To beru - prohlížeč požádá o stránku. Server mu k ní přibalí další soubory. Prohlížeč dostane stránku a začne ji zpracovávat a teprve teď zjistí, že daný soubor už má ve vyrovnávací paměti - jakékoliv saying “no” with RST_STREAM v daný okamžik nemá smysl, protože soubory již byly poslány.
Ono az admini zjisti, ze se jim traffic zvednul na desetinasobek, tak to nastavi vsude jako default. Vem si jen takovou blbinu, jako ze mas vypnutej flash/js/... a proste nechces bydefault videa. A ono ti to zacne trebas GB dat tlacit bez ptani. Aniz by sis to video pustil, ale nactes mainpage, a sosne se GB ... to bude kraasa.
Specielne pak u nasich slavnych dbilnich operatoru.
Já myslím, že pointa byla v tom, že ve chvíli, kdy prohlížeč zpracuje stránku, už bude mít data od serveru k dispozici a nebude je jak odmítnout. Což je podle mne celkem oprávněná připomínka.
Osobně nemám rád tento přístup, kdy se něco snaží přemýšlet za mne, resp. za můj prohlížeč, nějaké heuristiky obvykle fungují problematicky. Výsledkem bude opět tuna různých přepínačů v Apache - pokud je to tento prohlížeč, nezapínej tohle a tohle, nebo použij tento hack. Teď to navíc začíná vypadat na to, že totéž bude i v prohlížečích (ono to tam už ostatně je).
K protokolu se samozřejmě vyjadřuji pouze na základě informací v článku.
Takže se řadíte k těm, kteří jsou překvapeni tím, že prohlížeč ví, co má v cache.
Tak ještě jednou. Prohlížeč dostane nabídku na soubor, který podle serveru bude potřebovat. Prohlížeč v tu chvíli nečeká na zpracování stránky, protože to v danou chvíli vůbec nepotřebuje. Jenom se podívá, zda daný soubor nemá v cache - a pokud ano, odmítne ho, protože může použít tu verzi z cache. Už to chápete?
Server push není povinnou součástí každé odpovědi, server vám klidně může poslat jenom požadovaný soubor a nic dalšího neposílat. Takže když to jako správce serveru nechcete použít, nemusíte, nikdo vám to nenutí. Jsou ale lidé, kteří to chtějí použít, a pro ty to v tom protokolu je - kdyby to v protokolu nebylo, nemají jak takovouhle funkcionalitu zařídit. To, jestli server bude používat server push na základě heuristiky, jiným způsobem nebo vůbec, je opět na rozhodnutí jeho autorů a správců.
Pokud na to bude mít Apache tunu různých přepínačů, je to problém Apache, ne protokolu. Já používám server, který implementuje SPDY 3, a konfiguruje se tam akorát to, zda chci SPDY používat.
Já se k protokolu vyjadřuju na základě toho, že jsem sledoval jeho vývoj a četl jsem články od jeho spoluautorů.
Prohlizec v cache nic mit nebude, protoze se vsichni patlalove webu vehementne snazi na vsech frontach veskery cachovani eliminovat. Zaroven tak bude stahovat i data, ktera vubec nezobrazi, coz by pri parsovani zjistil a data nestahoval vubec.
Specielne pri kvalitach tech patlalu, kteri ty weby vyrabi.
Nikoliv, autor komentáře, na který jste reagoval, pouze podotýkal, že když prohlížeč požádá o html stránku, tak v té době ještě neví, jaké soubory bude dotyčná stránka potřebovat.
Server, který se bude domnívat, že je potřeba v zájmu rychlosti k souboru přibalit další soubory, mu ty soubory prostě přibalí a pošle.
Prohlížeč dostane všechny soubory a začne zpracovávat soubor, o který požádal. Teprve až teď může zjistit, které další soubory bude potřebovat. A zjistí že třeba polovinu souborů už má ve vyrovnávací paměti. Dále při tom zjistí, že z těch třeba 50 jako bonus přibalených souborů jich třeba 20 už ve vyrovnávací paměti má a že je tedy server posílal zbytečně. Ano, prohlížeč tyto zbytečně poslané soubory může ignorovat, ale to nic nemění na tom, že ty soubory byly poslány, byly poslány zbytečně, a že neexistuje způsob, jak serveru při požadavku na načtení požadovaného html souboru oznámit, které soubory server určitě nemá posílat, protože v okamžiku tohoto požadavku prohlížeč prostě nemůže vědět, které soubory dotyčná stránka bude používat a tedy ani nemůže vědět, které z nich má už ve vyrovnávací paměti.
Ne, kolega Jirsák Vám chtěl říci, že když tyto soubory přijímáte paralelně správcem cache, může je tento správce odmítnout nezávisle na aktuálně probíhajícím parsování stránky. Se stránkou ten proces totiž nesouvisí. Bohužel zvolil styl vysvětlení "to sem tě utřel, co?" a zapomněl to napsat tak, aby bylo možné pochopit, co tím chtěl říci, bez znalosti toho, co tím chtěl říci.
Obecně mi po zběžném pročtení specifikace, faq a popisu vzorové implementace přijde, že je to super nápad, ačkoliv to má podle mne pár ale:
- bude silně záležet na implementaci a agresivní server může nadělat víc škody, než užitku - to uznávají i autoři
- bude to dělat problémy na pomalých linkách (EDGE), kde nemáte šanci něco odmítnout tak, aby se to server dozvěděl dříve, než už to bude celé na cestě a zahltí Vám to spojení - paradoxně na takové lince bude mít push největší výhodu
- obsah v řádu pár kB nemá smysl odmítat (okno tcp), takže to bude v podstatě něco jako OEM Windows s počítačem, tedy to, co klienti většinou stahují se stránkou, berte, nebo zahoďte
Prohlížeč má i v HTTP/2 prostředky, jak sdělit co chce:
a) hlavička If-Modified-Since - pokud má něco v cache k dané stránce, tak takto může naznačit, jak staré jsou jeho položky
b) hlavička Accept umožňuje říci, co chci. Buď chci */*, nebo jen text/html a podobně - takže mohu říci flash nechci a nechci ani javascript - vyjmenováním toho, co chci
c) na If-Modified-Since mi přijdou asi odpovědi - např. default.css 304 Not Modified a prohlížeč se tak dozví o existenci pushnutelného souboru default.css a pokud zjistí, že jej již v cache nemá, tak může poslat požadavek (ještě před tím, než tu skutečnost zjistí z parsované hlavní stránky)
V okamžiku, kdy prohlížeč zjistí, že některý soubor vůbec nemá (nebyl ani součástí push) - tak pošle normální požadavek - tak jako dříve. Není žádná povinnost pushovat všechno a nebo pushovat vůbec něco - je to na volbě serveru / jeho správce.
Já tedy upřímně řečeno pochybuji, že se to například propracuje do takové komplexnosti, že si něčím ala Adblock zablokuji na stránce objekt, který je součástí push balíčku a prohlížeč to zohlední v hlavičce. Tj. technické možnosti jsou, ale podle mne se to nebude až na výjimky využívat.
- může poslat něco navíc - a to je víceméně chyba a ty budou existovat. Určitě budou existovat nástroje na lapání takových chyb a prohlížeč může upozornit např. v chybové konzoli.
- já si představoval, že bude nějaké volání v jazyku aplikace serveru např. http2_push_file('default.css'), které dá serveru vědět, že tento soubor má klientovi cpát. Programátor potom bude moci ovlivnit, které soubory tam má takto posílat přesně podle requestu z prohlížeče - konečné rozhodnutí může být na serveru.
- které neposlal? stačí když browser pošle v hlavičce If-Modified-Since: a server už bude vědět, které má pushovat a místo kterých pošle jen hlavičku a 304 Not Modified
- K čemu je dobré upozornění v chybové konzoli prohlížeče? Nebylo by lepší, kdyby se to dozvěděl server?
- Jako, dotazy na všechny potřebné soubory šly posílat v té multiplexovací hlavičce - na první dotaz si prohlížeč řekne pouze o html stránku, a v druhém dotazu požádá o všechny ostatní soubory, které ke stránce potřebuje a ještě je nemá ve vyrovnávací paměti.
- A když to prohlížeč nepošle?
- prohlížeč tuto informaci (nadbytečně poslaný soubor) zjistí, takže v prohlížeči informace je. Pokud bude chtít vývojář si to nějakým javascriptem cpát zpět na serveru - je to jeho volba (pokud bude mít prostředky detekce a to by snad mohl :-),
jestli bude někdy součástí nějakého protokolu hlášení chyb prohlížeče na server, to netuším.
- tak Google si řekl, že urychlí 1. načtení stránky. Zjistil, že to brzdí na 5 (+-) místech a toto je jedno z nich - tj. že prohlížeč musí dostat stránku, rozparsovat ji, aby vygeneroval další požadavky - a tak navrhl řešení. Výsledkem je rychlejší načtení o jeden ping (pokud to nedrhlo někde jinde)
- tak pokud jdete na stránku poprvé, tak dostanete všechno :-) - určitě to přece chcete. Pokud ne, tak jste měl požadovat HTTP/1 :-) Kdo jde na stránku s HTTP/2 a nedá If-Modified-Since, tak křičí "JÁ CHCI VŠECHNO!" :-)
1. Není to povinnost, ale dobrovolná možnost. Implementovat na serveru ji nemusíte.
2. Dokážu si představit situace, kdy se to hodí. Jsem na stránce jako nepřihlášený, zaloguju se do zákaznícké zóny. Server mě autorizuje a ví, že v zákaznické zóně jsou potřeba třeba... skripty pro nákupní košík a jiný podbarvení stránky. Pak třeba nějaký ikony na tlačítkách apod. Při tom ví, že platnost těchto souborů je nastavena na 24h a poslední login před týdnem a z jinýho stroje. Tak není důvod mu tyhle části neposlat, protože na 99% by je stejně sosal.
3. Provozovatel webu platí za konektivitu. Přenášet 2GB pokaždý, když klient zmáčkne F5, anbude nejlevnější a ono ho to donutí myslet, než něco pošle.
Tajtrlíka tady ze sebe děláte sám ...
Spousta lidí nepoužívá javascript, flash, ...
Inteligentně nastavený server (jakože dnes je to většina) bude vytrvale posílat javasrpt, flash, css prohlížeči který to bude vytrvale zahazovat ...
jo, jo ... třesky plesky o zrychlení přenosu, snížení datové náročnosti vs přenášení takto zbytečných dat
sem tam nějaká chybka v prohlížeči při zpracování HTTP/2 a zákeřný server může posílat cokoliv.
Cesta do pekla je dlážděna dobrými úmysly ...
Člověk Vašeho formátu musí moc dobře vědět, že ne vše se ventiluje veřejně či ve specifikacích či FAQ.
Vy jste se podílel na tvorbě tohoto standardu?
A pokud ten problém nevidíte nebo nechcete vidět, tak je dosti smutné ...
Vsadíte na to svoji profesní čest? Vzhledem k tomu jak se zde vystupujete, tak o tom pochybuji.
On ten problém neexistuje. Vidíte ho jenom vy, protože jste nepochopil specifikaci.
S HTTP/1.1 to bylo tak, že prohlížeč dostal HTML stránku, tu parsoval a teprve během parsování zjistil, že ještě bude potřebovat tenhle obrázek, támhleten skript a tohle CSS. Teprve v tom okamžiku o ně požádal server a ten je začal zasílat. Takže tam byla zbytečná prodleva. Která je hodně nepříjemná třeba u skriptů, které nemají nastaven příznak, že se mohou zpracovat asynchronně (dnes je těch synchronních skriptů většina), takže se musí počkat, až se skript stáhne, zpracuje a teprve pak se může pokračovat v parsování stránky (a hned na dalším řádku se zjistí, že je potřeba stáhnout další soubor ze serveru).
S SPDY a HTTP/2 to funguje tak, že autor webu může instruovat server, aby s nějakým požadavkem poslal klientovi rovnou další soubory. Místo toho, aby se čekalo, až klient zjistí, že bude soubor potřebovat, mu ho tedy server začne posílat rovnou. Klient může stahování kteréhokoli souboru (tedy i toho, který iniciativně začne posílat server) přerušit. V SPDY už to takhle funguje dávno, a testy pokud vím ukazují, že to přispívá k rychlejšímu zobrazení stránky (ostatně proto to Google do SPDY přidal).
Ale jistě, že existuje ...
Nemusíte stále dokola opakovat jak je to teď špatné (divím se, že ten web vůbec funguje) a jak to bude dokonalé s WEB2.0 ehm pardon s HTTP/2, to už všeobecně známá věc
To jste tak odtržení praktického fungování věcí a standardů?
Díky pravidlům silničního provozu nemůže nastat žádná dopravní nehoda, přesto ale ...
SPAM je zakázaný a nikdo by jej neměl, tedy do své schránky dostávat, přesto ale ...
Specifikace HTTP/2 umožňuje přerušit stahování dodatečných souborů, nicméně se servery mohou naprosto legálně v souladu se standardem o to pokoušet (bušit na vrátka, hledat slabá místa). Prohlížeč tato data odmítá, nicméně ... https://code.google.com/p/chromium/issues/list
Čím jsou věci komplikovanější tím jsou náchylnější na chyby. Že je specifikace HTTP/2 výživné čtení, to popřít nemůžete.
Mohl byste konkrétně takový problém popsat? Zatím to totiž vypadá, že vůbec netušíte, o čem je řeč.
Dneska prohlížeč parsuje stránku, narazí na odkaz třeba na obrázek, podívá se, zda obrázek nemá v cache, a když ne, pošle na server požadavek na stažení toho obrázku.
S HTTP/2 může server ten obrázek prohlížeči poslat rovnou. Celé je to jen urychlení, když server ten obrázek nepošle, dojde prohlížeč k místu, kde je potřeba, a sám si o něj požádá. Kde přesně je tedy ten problém, který vznikl s HTTP/2 a u HTTP/1.1 neexistoval?
Co si představujete pod „bušit na vrátka, hledat slabá místa“? Můžete popsat princip, jak by ten server útočil?
Že je specifikace HTTP/2 výživné čtení, to popřít nemůžete.
Já ji sleduji už od dob SPDY, a připadá mi, že ta specifikace vyřešila spoustu problémů HTTP a podařilo se vyřešit i spoustu problémů, na které se přišlo během provozu SPDY. Mně se ta specifikace líbí, třeba proto, že je mnohem jednoznačnější, než původní specifikace HTTP/1.1.
Nine Things to Expect from HTTP/2 bod 7:
That’s because textual protocols have to cover issues like how to delimit strings (counted? double-newline?), how to handle whitespace, extra characters, and so on. This leads to a lot of implementation complexity; in HTTP/1, there are no fewer than three ways to tell when a message ends, along with a complex set of rules to determine which method is in use.
HTTP/1’s textual nature has also been the source of a number of security issues; because different implementations make different decisions about how to parse a message, malicious parties can wiggle their way in (e.g., with the response splitting attack).
Nevím jak Vám, ale mně to zní jako docela rozumné argumenty.
Mno a do binarniho streamu se prozmenu da vlozit kus spustitelnyho kodu, kterej si pak prohlizec klidne spusti, trebas diky nejaky uzasny ficure ktera zavola exec. To se do textu dela dost blbe, treba prave kvulu vsemoznym uvozovkam, ktere se v te binarce jaksi neresej.
Mimochodem, nefunguje presne takhle vecne deravej flash?
Tak třeba tady je popsána díra, http://www.root.cz/clanky/dira-v-bashi-ktere-si-20-let-nikdo-nevsiml/ která se dá využít i přes textový formát hlaviček a binární hlavičky by na její využitelnosti nic nezměnily.
Takže tvrdím, že binární/textový formát výrazně bezpečnost neovlivní. Textová reprezentace odpudí maximálně 1% útočníků, kteří se nechtějí učit, jak escapovat kód a jsou líní si to i vygooglovat :-)
Nutno dodat, že binární reprezentace stejný díl útočníků odradí, protože se nechtějí učit jak kód zakódovat aby byl spuštěn (ostatně donuťte třeba prohlížeč obrázků aby spustitelný kód vložený do jpegu spustil (příklad binárního formátu). Většinou je potřeba zjistit kde mu šlápnout na kuří oko, třeba nějakým vhodným buffer overflow), a jsou líní si to vygooglovat.
1) obrazky spustit lze (obzvlast v systemu ktery netreba jmenovat)
2) od obrazku se prevazne neceka nic jinyho, nez jeho zobrazeni => v nejjednodussim pripade se veme sada bajtu a natlaci se do graficky pameti.
Kdezto web musi delat spoustu ruznych veci a spousta toho co je uvnitr slouzi jako parametr hromady funkci. A vzhledem k tomu, ze dneska si s kontrolou vstupu nikdo hlavu nelame, tak v okamziku, kdy ten vstup bude binarni ...
Nechci vám tady kazit vaše rozsáhlé teorie založené na rozsáhlých neznalostech, ale HTTP je pouze přenosový protokol, který binární obsah umí přenášet odjakživa. A web nemusí být přenášen jenom protokolem HTTP, webovou stránku si klidně můžete stáhnout přes FTP, poslat e-mailem, nebo ji mít jako soubory na disku. Tam všude také mohou být binární data. Takže to, že se na webu pracuje s binárními daty, platí už asi tak 25 let. Naštěstí to nijak nevadí, protože parametry funkcí opravdu nejsou binární a nebinární, ale mají různé datové typy - třeba char, integer, pointer nebo v objektových jazycích typicky pointer na určitý objektový typ. No a hlavně ty funkce zpravidla dělají něco jiného, než že by své parametry spouštěly jako spustitelný kód.
HTTP dtto.
Poslyšte, pokaždé, když uvedete svůj komentář „blb jako XY“, usvědčí vás ostatní z toho, že o dané věci nevíte vůbec nic. S DNSSEC jste se tady takhle ztrapnil pro jistotu dvakrát, v této diskusi jste předvedl, že nevíte nic o kešování v prohlížečích, teď že vůbec nechápete, co je to binární protokol a jak se vůbec webové stránky v prohlížečích zpracovávají. Když už jste tedy dosáhl toho, že jste tu všeobecně považován za blba, nestálo by za to opustit svou ničím nepodloženou aroganci, a začít se chovat velice slušně, abyste se alespoň něco dozvěděl?
Ano, to jste přesně popsal důvod, proč je HTTP/2 binární protokol, protože pokud nadefinujete formát, který je binární, tak nenechává prostor pro vlastní kreativitu.
Nejasnost v \r\n vs \n vs ... budete mít v textovém formátu vždy, protože vám budou lidi řvát, že to zrovna jejich oblíbeným telnetem nejde udělat...
Obecně je formát, který není potřeba parsovat kvůli delimiterům (ať už to jsou djb netstrings, Google protobuf nebo cokoli jiného, kde není potřeba hledat ve stringu CRLF) lepší pro síťový přenos dat, kterým nelze věřit.
Do binárního formátu pak jde taky přidat komprese... a dá se využít celá bitová šířka přenosu (jen si vemte, jak moc je neefektivní base64).
Vlastní kreativita se nechá aplikovat kdykoliv a jakkoliv.
Nejasnost mezi \r\n vs \n je v pohodě, pokud se zakáže \r a případné jeho výskyty se budou ignorovat.
Jakýkoliv formát, který je potřeba zpracovávat, je problematický, protože to zpracování je největší slabinou. Protože nikdo nikdy nikomu nezabrání napsat parser, který parsuje něco trochu jinak, a pokud se to stane součástí oblíbeného zařízení či programu, jiná varianta standardu je na světě.
Přiznám se, že nevidím moc rozdílů mezi hledáním oddělovačů a počítáním přírůstků, o kolik se má posunout ukazatel.
> Nejasnost mezi \r\n vs \n je v pohodě, pokud se zakáže \r a případné jeho výskyty se budou ignorovat.
První bugreport "Mně z toho leze jeden dlouhý řádek, to je protokol na ..." za 3 2 1.
> Jakýkoliv formát, který je potřeba zpracovávat, je problematický, protože to zpracování je největší slabinou.
MUHEHEHE
Bez zpracování se jakákoliv data dají poslat tak do /dev/null. Pokud se mají k něčemu použít, tak se musí co?
Mě ten bod přijde trochu pochybný. Implementaci HTTP/2 budou podle mě dělat primárně 3 hlavní prohlížeče (FF,Crome,IE), 3 hlavní servery (apache,nginx,iss) a pár síťových knihoven a tam je určitě parsování napsáno dobře.
Pro ostatní aplikace - když si někdo zbastlí např. na jednočipu primitivní server nebo aplikaci na stahování dat ze serverů (a dělá chyby v parsování) - tak tam není moc smysl přidávat další složitosti a jít na http/2 - výkonový přínos bude pravděpodobně zanedbatelný (pokud to nebude na nějaké hodně pomalé lince).
Mně jako nejrozumnější část bodu 7 připadá poslední odstavec: "Of course, all of this is small solace for the poor ops person who just wants to debug the protocol. That means that we’ll need new tools and plenty of them to address this shortcoming; to start, Wireshark already has a plug-in." Ty ostatní argumenty jsou pro rozhodování mezi textovým a binárním protokolem irelevantní.
Implementační složitost binární obálky v HTTP/2 daleko je mnohem vyšší, než ošetření konců řádků, whitespace, apod. v HTTP/1. Délka zprávy je určená na základě kombinace hlavičky content-length a součtem délek DATA frames, proti HTTP/1 s Content-Length a Transfer-Encoding: chunked to není až takový rozdíl.
Spousta problémů s textovou reprezentací je způsobena nikoliv protokolem, ale používáním řetězcové knihovny jazyka C. Po dekódováná stejně dostaneme hodnoty hlaviček jako text, který se bude dál zpracovávat.
Záleží na konkrétním protokolu. V případě HTTP/1.1 a HTTP/2 jsem o tom přesvědčen. Oba protokoly jsou do značné míry stejné, HTTP/2 má navíc binární obálku. Místo jednoduchého parsování posloupnosti řádků "Jméno: hodnota" je potřeba řešit kompresi a dekompresi hlaviček (specifikace má 57 stran). Nakonec z toho stejně vypadnou textové hodnoty jednotlivých hlaviček, a ty je potřeba dál zpracovat.
K tomu si přidejte, že je rozdíl mezi tím, co říká specifikace, a tím, co po síti skutečně chodí. Textový formát má redundanci, která často umožní pochopit, co tím odesílatel vlastně myslel, a nějak rozumně to zpracovat. Když místo nestandardního textu přijde nestandardní binární smetí, tak je mnohem těžší se s tím vypořádat.
Jak často se to stává, že chodí nějaké nestandardní binární smetí? Podle mne se nanejvýš stane, že nějaká položka je mimo vyjmenované hodnoty (typicky "pro budoucí použití, musí být nula" a přijde nenulová hodnota), ale tím nemůže rozhodit parsování zbytku zprávy. Navíc ta heuristika, která pochopí, co tím odesílatel vlastně myslel, musí být součástí kódu. A každý si ji udělá trochu jinak, pak někdo naprogramuje kód jen tak od oka ("vždyť je to jednoduchý textový protokol, to nemusím číst specifikaci"), proti jedné implementaci mu to funguje, a pak se hrozně diví, že s jinou implementací to nefunguje.
Třeba ta "jednoduchá posloupnost řádků" u HTTP/1. Co když se tam někde vyskytne dvojtečka? Co ta mezera, je povinná jedna, může jich být víc, může být vynechaná? Co když se tam vyskytne CRLF, nebo jen jeden z těch znaků? Hned to přestává být tak jednoduché, při parsování musíte ty hlavičky procházet znak po znaku a jejich obsah se musí v paměti kopírovat, když je chcete dál předat jako dvojici textových řetězců. Ve skutečnosti se tedy dají hlavičky HTTP/2 strojově zpracovat mnohem efektivněji, než hlavičky HTTP/1.1.
V reálném provozu HTTP/1.x se vyskytují všelijaká porušení specifikace. Např. opakování neopakovatelných hlaviček (Content-Type), i tak zásadních pro parsování zprávy, jako je Content-Length, vynechání jména hlavičky (včetně dvojtečky) v Set-Cookie, nebo závislost na rozdělení hlaviček do paketů. Proč bych si měl myslet, že implementace binárního protokolu specifikaci porušovat nebudou?
Dvojtečka neovlivní rozdělení textu do řádků. Zpracování různých variant mezer a CRLF je popsané v RFC. Pravidla sice nejsou úplně triviální a liší se mezi RFC 2616 a 7230, ale pořád jsou mnohem jednodušší, než binární (de)kódování hlaviček v HTTP/2. Když chcete předat jako dvojici textových řetězců hlavičku z HTTP/2, tak musíte hlavičky dekódovat, takže obsah budete v paměti taky kopírovat. V HTTP/1 v C teoreticky nic kopírovat nemusím, protože první znak (whitespace nebo dvojtečku) za jménem hlavičky a první znak za hodnotou (whitespace, CR, nebo LF) nahradím nulovým bajtem a mám dva řetězce.
Chybný počet hlaviček je jiný typ chyby, a může se objevit úplně stejně u textového i binárního protokolu. Mně tedy dekódování binárních hlaviček v HTTP/2 připadá mnohem jednodušší, než dekódování hlaviček v HTTP/1.1. V případě HTTP/2 není kopírování potřeba - hlavičky tam nejsou komprimované jako posloupnost oktetů (třeba gzipem), "komprimace" hlaviček je postavena na vynechání opakujících se hlaviček. To nahrazení nulovým bajtem v HTTP/1.1 je sice hezké, ale na začátku nevíte, jak je ta hlavička dlouhá a jak velký pro ni máte vyhradit buffer. Navíc jakmile v té hlavičce máte nějaké uvozovky, je zpracování hlavičky komplikovanější, než jen přidání nulového bajtu.
Z 57 stran specifikace kódování hlaviček HTTP/2 je pro implementaci relevantních cca 23 stran. Pro implementaci parsování hlaviček v HTTP/1 je relevantní sekce 3 do 3.2.4 včetně z RFC 7230, cca 7 stran. Z toho se velká část týká hodnot hlaviček, které vypadnou z dekódování binárního formátu, a je tedy relevantní i pro HTTP/2. V HTTP/1 si vystačíte s rozlámáním textu podle (CR)LF, nalezením dvojteček, odstraněním nadbytečných mezer a převodem jmen hlaviček na malá písmena. Dostanete hodnoty, které musíte dál zpracovat úplně stejně v obou protokolech, včetně případných uvozovek.
Když se budeme bavit o zakódování, tak místo celého algoritmu pro HTTP/2 si vystačíte pro každou hlavičku s přidáním Jméno + ": " + Hodnota + CRLF na výstup odesílaný do sítě. Jestli nevěříte, že je HTTP/1 jednodušší, zkuste si obě verze protokolu implementovat.
A takhle právě vznikají ty chybné implementace. V případě HTTP/2 by vás asi nenapadlo to implementovat jen tak od oka, aniž byste si přečetl specifikaci. S HTTP/1.1 to klidně uděláte, protože máte pocit, že je to jednoduchý textový protokol, kvůli kterému specifikaci číst nemusíte. Kdybyste si tu specifikaci přečetl, zjistil byste, že hlavičky mohou být víceřádkové, protože uvozovky mají speciální význam. Takže nestačí text rozlámat podle CRLF, ale musíte obsah hlavičky parsovat, odstraňovat uvozovky a CRLF v uvozovkách nepovažovat za ukončení hlavičky.
Není mi jasné, proč si myslíte, že bych HTTP/1.1 implementoval "jen tak od oka", a že ho považuji za jednoduchý textový protokol, ale myslíte si to špatně :-)
Možnost interpretovat specifikaci HTTP tak, že CRLF uvnitř uvozovek, přesněji uvnitř uvozovek (quoted-string) nebo závorek (comment) a zapsané pomocí quoted-pair ("\" CHAR), neznamená ukončení hlavičky, byla chyba v RFC 2616, která byla opravena v RFC 7230. Hlavičky mohou být víceřádkové, pokud pokračovací řádek začíná mezerou nebo tabulátorem. I tohle je v RFC 7230 označené jako deprecated.
Už jsem to tu psal čtyřikrát. Rozdělit text na řádky podle CRLF a každý řádek podle dvojtečky (plus několik technických detailů), nebo naopak poskládat dvojice jméno-hodnota do textu HTTP/1.x zprávy, je mnohem jednodušší, než kódování a dekódování podle HTTP/2. Jestli tomu nevěříte, tak si to zkuste implementovat.
Zkusím Vám to vysvětlit ještě jednou... Některé chybné implementace mohou vzniknout tak, že někdo považuje čtení specifikace za zbytečné. Jiné chybné specifikace zase vznikají tak, že si někdo sice přečte specifikaci, ale něco v ní špatně pochopí nebo prostě v implementaci udělá chybu. Pravděpodobnost takových chyb stoupá s délkou a složitostí specifikace.
Nicméně já jsem psal o implementaci podle specifikace. Když budu implementovat parsování hlaviček HTTP/1.1 a budu si chtít maximálně ulehčit práci, tak rozlámu text podle CRLF na jednotlivé hlavičky. Každou rozdělím podle dvojtečky na jméno a hodnotu. Jakmile najdu někde samostatné CR nebo LF, nečtu dál, vracím 400 Bad Request a zavírám TCP spojení. Když najdu mezeru nebo tabulátor na začátku řádku nebo před dvojtečkou, nebo kdekoliv najdu znak ze skupiny CTL (kromě SP a HTAB), reaguji stejně. Z hodnoty odříznu whitespace na začátku a na konci. Dostanu posloupnost hlaviček ve formě dvojic řetězců jméno-hodnota. A mám hotovo, dodržel jsem specifikaci (RFC 7230). Víceřádkové hlavičky mě nezajímají: na obs-fold mám explicitně povoleno vrátit 400, Vámi zmiňovaná možnost CRLF v quoted-string (možná pomocí quoted-pair) je v RFC 7230 zakázaná a i podle RFC 2616 je její validita hodně diskutabilní. Ještě zbývá odesílání hlaviček, ale to je jeden printf.
A teď si předchozí odstavec porovnejte s kódováním a dekódováním podle HTTP/2.
Nějak se vám ten jednoduchý algoritmus komplikuje. Přitom jste popsal ten nejjednodušší případ - rozumný klient i server samozřejmě musí počítat i s tím, co RFC povoluje ale nedoporučuje. A teď si představte, že byste implementoval reálný klient nebo server, a chtěl se vypořádat i s tím, že někdo kašle na RFC a hlavičky vypisuje jedním printf
. (No, v tomhle případě byste brzy zjistil, že to řešení nemá.)
Porovnal jsem si to už dávno a HTTP/2 mi z toho vychází jako jednodušší na praktickou implementaci.
Ty složitější případy nejsou zase o tolik složitější. Co je "rozumný klient i server" závisí na okolnostech. Ale asi už Vám přestávám rozumět. Ono RFC zakazuje printf? Napsal jsem popis implementace na jeden odstavec. Každý programátor si snad dokáže představit, jak by vypadal odpovídající kód. Předpokládám, že dokážete kódování a dekódování hlaviček v HTTP/2 popsat také v jednom odstavci, nebo dokonce předvést ten jednodušší kód.
Obávám se, že tato naše diskuse ztrácí smysl a nikoho nezajímá. Proto v ní nehodlám pokračovat.
Popsal jste popis chybné implementace. To nic nevypovídá o tom, jak by vypadala správná implementace. RFC nezakazuje printf
, ale když použijete jenom printf
, vaše implementace nebude odpovídat RFC. Stačí si to dát dohromady s tím vaším popisem parsování. Jak by to asi dopadlo, kdyby v hodnotě hlavičky, kterou byste poslal do printf
, bylo CRLF?
Pan Beran porovnával porovnatelné: poslední verzi protokolu HTTP (1.1) s novou verzí protokolu HTTP (2.0). Vy porovnáváte neporovnatelné: tvrdíte, že server podporující HTTP/1.1 musí umět odpovídat i na HTTP/1.0 a starší. To ale bude muset server odpovídající na HTTP/2.0 (nějakou dobu) také. Pokud budu mít HTTP/2.0 only server, tak úplně stejně mohu mít HTTP/1.0 only server.
Já jsem porovnával praktickou implementaci – tj. mám v jednom serveru vedle sebe implementaci „jednoduchého textového protokolu“, tj. HTTP 1.0 a nějaký kompromis HTTP 1.1 mezi RFC 2616 a RFC 7230–7235, a implementaci binárního protokolu HTTP 2.0. Že jsou to na jedné straně tři protokoly a na druhé jenom jeden? No jo, ale to je právě ta komplikovanost „jednoduchého textového protokolu“, kde se vstup „jednoduše“ rozdělí podle řádek – jenže pak se ukáže, že nikdo neví, co je to řádek, a v každé verzi protokolu je to jinak (dokonce pro jednu verzi protokolu existují dva nekompatibilní standardy).
Mimochodem, samotné parsování HTTP hlaviček v HTTP 2.0 je oproti HTTP 1.x triviální, trochu to komplikuje kešování hlaviček. Takže kdybychom chtěli porovnávat porovnatelné vaším způsobem, bylo by nutné porovnávat parsování hlaviček dle RFC 7230 a parsování hlaviček (bez kešování) dle HTTP 2.0.
Ty porušení specifikace IMO často vznikají tak, že si nějaký matlal řekne "To je text, to je jasný. RFC je pro sraby." A už to smolí. U binárního protokolu bych podobných expertů čekal trochu míň.
Samozřejmě, že budou existovat porušení specifikace. Tam to bude úplně na stejno s textovými protokoly. Bude se to flíkovat dodatečně (prasárny se moc nedají předvídat ani u textu) a jen pokud se to vyplatí.
http://http2.github.io/http2-spec/compression.html - dejte to někomu implementovat a potom se jej zeptejte, zda je jednodušší parsovat text :-)
Jinak nginx už napsal, že do konce roku bude hotová jejich implementace > http://nginx.com/blog/how-nginx-plans-to-support-http2/
Pánové, pánové, pánové....jak vás tady poslouchám, nestačím se divit. Zkuste si vygůglit jméno Surý. Pak možná zjistíte, že ho poučovat o internetové bezpečnosti, či ho nazývat tajtrlíkem je totéž, jako pána Boha poučovat o stvoření světa.
Pokud vám to vaše ega dovolí, sklopte uši, stáhněte ocas a přemýšlejte proč také nejste Recovery Key Share Holders.
Tímto také netrpím. Ale ještě z minulého režimu jsem zvyklý si zjistit, kdo proti mě stojí a co umí, aby mě nedostal.
No a s tím tajtrdíkem OS poněkud nediplomaticky upozornil na 1. zákon diskuze, co praví: "Nikdy se nepři s blbcem, protože lidé okolo vás by si nemuseli všimnout, že je mezi vámi rozdíl."
Samozřejmě - to vysvětluje je přístup "šifrovat, šifrovat, šifrovat za každou cenu". Jinými slovy nevěřit za žádných podmínek nikdy a nikomu, nikomu nepůjčovat svá komunikační zařízení, neotevírat jiné, než vlastní soubory. Protože ani ten nejzabezpečenější protokol nezabrání uživateli, aby si nějaký nepříjemný program nezatáhl do počítače, protože ho někdo na ten odkaz prostě umístil schválně - či si ho na flash disk třeba umístil schválně.
Šifrování je hezké, to ano, jen by to chtělo doladit. Proč? Ceny za certifikáty nejsou zrovna lidové a když máte jako já 10 webů, tak je celkem sranda řešit certifikáty. Mimochodem, copak se stane, když prošvihnete termín platnosti certifikátu? No, to bude nefunkčních webů, že. No a pak případné prodeje domén se tím také dost zkomplikují. Tohle se bude muset nějak inteligentně vyřešit.
PS: software není možné nikdy na 100% zabezpečit. Proto počítejte s tím, že do týdne tu bude 10 způsobů, jak se s vynuceným šifrováním vypořádat, třeba pomocí podrvžených certifikačních autorit apod. A v nejhorším si zaskočí do Lenova, ti budou vědět jak na to. Konec konců stačí do počítače dostat jeden certifikát a pak komunikaci přesměrovat na proxy, která vše bude dekriptovat a znovu skládat dohromady. Když o tom tak přemýšlím, tak jediné co se vynuceným šifrováním vyřeší, je odposlech plain textu amatéry, kteří dnes jen vystčí wifi anténu z okna a sosají co kolem létá. Nic víc se šifrováním nevyřeší a to je dost málo.
Konečně někdo, kdo o tom přemýšlí a není fanatický aktivista. Díky.
____
Vynucené šifrování všeho na Webu skutečně téměř nic neřeší. Služby, které z podstaty šifrované být musí, jsou šifrované už dnes. Pokud ne, je to jen hloupost jejich provozovatele, proti které není imunní nic.
HTTP/2 může být zajímavá možnost i když jeho binární návrh je ošklivý...ale proč jej povinně šifrovat, opravdu nechápu. Google zřejmě potřebuje vyvolat pocit bezpečí u těch, ze kterých saje data - proto ta podivná implementace v prohlížečích...(Mozilla je dnes v jeho vleku).
Teoreticky máš pravdu. Prakticky má správce root zone jen velmi omezené možnosti jak, útočit na DNSSEC koncové entity. Když přidá útočný záznam, DNS servery je budou ignorovat jako ne-glue záznam uvnitř delegace. I kdyby upravil všech 13 sad DNS serverů, aby poskytovaly i takové záznamy, úspěšnost útoku bude beztak velmi malá, protože rekurzory budou mít správně nacachovanou delegaci pro jiné domény ze stejné TLD.
Jedinou možností tak v podstatě je předelegovat celou TLD a pak ještě čekat na douhatánské TTL. Na to by kterýkoli postižený správce TLD jistě velmi rychle přišel a rozpoutal skandál, pokud by nebyl nějakým vnějším vlivem umlčen.
Já myslím, že všiml... nebo by si toho všimli uživatelé. Zcela nedávný příklad:
https://forum.pfsense.org/index.php?topic=87491.0
http://www.unbound.net/pipermail/unbound-users/2015-February/003774.html
Asi zpackaná implementace, ne? (tl;dr; "web pages load blank") Představ si, že se ti prostě v případě kompromitace root zone změnil klíč pro zónu .cz, v případě kompromitace CZ.NIC se změnil jenom klíč pro zónu tastránka.cz. Jediné jak by sis toho podle mě mohl všimnout je mít pro DNS nějaký network consensus jako dělá Perspectives pro HTTPS.
Tak už jsem se konečně dočetl; tedy pro odstatní TL;DR:
Majitelé pfSense si nainstalovali Unbound a z nepochopitelného důvodu u něj vypnuli volbu harden-glue. Následně se strašně divili, když jim někdo v glue záznamech otrávil cache. V unboundu žádná vada nebyla, jen byl v nejnovějším RC vylepšen, aby i v případě, že někdo vypne harden-glue, nebyla jeho cache tak snadno otrávená.
- Již zmíněný projekt Let's Encrypt to dokonce chce zautomatizovat (a CA by pak v podstatě prodávaly akorát EV + certifikáty státní správě :))
- StartCom (a i když Vás donutí udělat Class 2 validaci, protože máte na stránce slovo Donate, tak je to jenom cca $60 jednou rocne, coz je vcelku snesitelne - a jeste na konci te periody si muzete vystavit certifikaty na dalsi dva roky. Tj. platba je nutna cca jednou za tri roky...)
- Některé CA Vám dají cert zdarma, pokud jste aktivní Open Source projekt
Systém CA je možná prohnilý (netvrdil bych, že je k ničemu), ale vymyslel někdo něco lepšího? DANE nenahradí certifikáty podepsané důvěryhodnými CA. Pro vydání OV e EV certifikátů stejně budou CA potřeba.
>Vlezes na zcela bezpecnej web, kterej ma seflsigned a browser se z toho muze posrat.
A kde berete tu jistotu, že je to právě ten zcela bezpečný web, na který se chcete dostat? A kde berete jistotu, že vás nikdo neodposlouchává.
Pokud tomu certifikátu věříte, tak si ho nainstalujte a nemusíte takové problémy řešit.
Chování browseru je v tomto případě úplně správné.
>Vlezes na web banky, mas tam uplne jinej cert nez vcera, a browseru to vubec nevadi.
A na tom je špatného co? Třeba provozovatel stránky certifikát revokoval (ať už z důvodu vyzrazení klíče nebo třeba kvůli přechodu k jiné CA). V takovém případě by browser plašil zcela zbytečně.
>Měl by se tedy podle tebe browser chovat stejně i v případě, že vlezeš na HTTP stránku?
Na to není jednoduchá odpověď. U HTTP neprobíhá žádná kontrola identity serveru, takže z tohoto hlediska není před čím varovat. To, že nemám jistotu, zda jsem na pravém webu vyplývá už z toho, že komunikuji HTTP protokolem.
Bohužel, většina uživatelů to vůbec neřeší, takže je vhodné na to upozornit.
Nakonec Chrome (a později určitě i další) bude přesně takové varování zobrazovat. Mají to v plánu na rok 2016.
Nešifrovaný protokol bez ověření identity prostě nemá na internetu co dělat (s jednou jedinou výjimkou).
Ale to není jenom věcí HTTP. Daleko horší situace je FTP.
> U HTTP neprobíhá žádná kontrola identity serveru, takže z tohoto hlediska není před čím varovat. To, že nemám jistotu, zda jsem na pravém webu vyplývá už z toho, že komunikuji HTTP protokolem.
U HTTPS se self signed certifikátem neprobíhá žádná kontrola identity serveru, takže z tohoto hlediska není před čím varovat. To, že nemám jistotu, zda jsem na pravém webu vyplývá už z toho, že komunikuji HTTPS protokolem bez důvěryhodného certifikátu.
> Nakonec Chrome (a později určitě i další) bude přesně takové varování zobrazovat.
Jako že se ti fakt zobrazí stránka, kde se musí klikat na Advanced a Proceed? U každé HTTP stránky? Nebojí se, že se na ně uživatelé vykašlou?
>U HTTPS se self signed certifikátem neprobíhá žádná kontrola identity serveru, takže z tohoto hlediska není před čím varovat.
Nikoli, drahý Watsone, kontrola identity probíhá. Jinak by to popřelo principy TLS.
>To, že nemám jistotu, zda jsem na pravém webu vyplývá už z toho, že komunikuji HTTPS protokolem bez důvěryhodného certifikátu.
A co je podle vás důvěryhodný certifikát? Ten který vydala nějaká CA?
Já bych to tak moc nebral. Pro někoho nejsou CA dostatečně důvěryhodné a tak si udělá vlastní CA, které věří on sám.
Důvěra je velmi subjektivní. Jako jediné kritérium důvěryhodnosti nelze brát fakt, zda je certifikát předinstalován v OS nebo v úložišti prohlížeče.
Mám-li úzkou skupinu uživatelů, například firmu a pro interní potřeby si zavedu web s vlastním certifikátem, tak pro mě a ostatní zaměstnance bude více důvěryhodný, než kdyby ho vydala důvěryhodná CA. Nad certifikátem mám plnou kontrolu.
>Jako že se ti fakt zobrazí stránka, kde se musí klikat na Advanced a Proceed? U každé HTTP stránky?
Ano, tak néjak to bude.
> Nebojí se, že se na ně uživatelé vykašlou?
To se musíte zeptat jinde.
> Nikoli, drahý Watsone, kontrola identity probíhá.
Ano, proběhne kontrola, že server, který ti poslal ten certifikát, je server, který ti poslal ten certifikát. Velmi užitečné.
> A co je podle vás důvěryhodný certifikát? Ten který vydala nějaká CA?
To nedokážu obecně zhodnotit. Ale o tom diskuze nebyla.
>Ano, proběhne kontrola, že server, který ti poslal ten certifikát, je server, který ti poslal ten certifikát. Velmi užitečné.
Kontrolovat se dá vůči certifikátu, který je nainstalovaný.
Pořád mluvíte jen o selfsigned, což jsou obecně všechny kořenové certifikáty (ty které vydala CA i ty, které si sám vygenerujete).
Já bych to zůžil na certifikáty, které nejsou vydané CA se všeobecnou důvěrou.
Kromě toho, použít selfsigned CA rovnou pro webserver, to je tak trochu čůňátko-řešení.
>Vlezes na web banky, mas tam uplne jinej cert nez vcera, a browseru to vubec nevadi.
A na tom je špatného co? Třeba provozovatel stránky certifikát revokoval (ať už z důvodu vyzrazení klíče nebo třeba kvůli přechodu k jiné CA). V takovém případě by browser plašil zcela zbytečně.
Třeba má banka v obchodních podmínkách fingerprint certifikátu nebo jméno CA a vaši povinnost toto ověřovat při každém použití internetového bankovnictví.
"A na tom je špatného co? Třeba provozovatel stránky certifikát revokoval (ať už z důvodu vyzrazení klíče nebo třeba kvůli přechodu k jiné CA). V takovém případě by browser plašil zcela zbytečně."
Ne, zbytecne by rozhodne neplasil, dal by uzivateli moznost overit, zda ta zmena je vporadku. Treba tak, ze zvedne telefon a do banky zavola.
Ona totiz banka CA meni pomerne vyjimecne, a korenovy certifikaty dost casto plati desitky let, takze to, ze by certifikat byl ze dne na den podepsanej uplne necim jinym ne pomerne velmi nenormalni stav.
=> browser by si mel pri prvni navsteve (volitelne s dotazem) zapsat "tenhle strom pro tenhle web" a rvat, pokud se to zmeni. A ne vopruzovat na kazdym webu s ssl, kterej pouziva strom provozovatele, kterymu se nechce calovat za milost distribuce v 158 browserech.
Takové CA existují, ale většinou je to dost omezující. Některé nejsou někde důvěryhodné.
StartSSL je sice důvěryhodná téměř všude, ale certifikát bych od nich nechtěl. Nechávat si generovat svůj privátní klíč u nich je poněkud nebezpečné. Moźnost vygenerovat si klíč u sebe a jim poslat žádost k podepsání u free certifikátů není, pokud vím.
To už je lepší si za cca 300 koupit certifikát od nějaké pořádné CA.
Až se rozšíří DANE, tak DV certifikáty úplně ztratí smysl.
SW generátor nikdy nedá tak kvalitní klíč, protože negeneruje zcela náhodná čísla.
SW: http://scruss.com/wordpress/wp-content/uploads/2013/06/randu17_rgb.png
HW: http://scruss.com/wordpress/wp-content/uploads/2013/06/random20130606210630.png
Nechápu, co tím chtěl básník říci. CA také používají si generují klíče na HSM a tam je také mají uložené.
Vy si vygenerujete klíč, jím podepíšete certifikát, ten odešlete CA, která ho podepíše ze svého HSM a pošle zpět.
Pro uživatele je HSM možnost, pro CA nezbytnost. Kromě generování dostatečně náhodných čísel ještě slouží HSM k bezpečnému uložení klíče.
Zpět k: http://www.root.cz/clanky/protokol-http-2-byl-dokoncen-prohlizece-uz-ho-podporuji/nazory/534347/
Přečíst bod b), pak přečíst vaši odpověď na bod b)
Tak bez mlžení :
- OS napsal, že je Startcomu možné poslat k podepsání _jakýkoliv_ certifikát pomocí CSR.
- Ty jsi odepsal, že to není dost dobré, protože lepší je kdyby byl vygenerovaný hardwarově.
- "Já" odepsal, že je úplně jedno jakým způsobem je ten certifikát vygenerovaný a dal jako příklad kostky.
- Ty pořád píšeš o tom, že softwarově vygenerované certifikáty nejsou to pravé.
- "Já" tě považuje za idiota, nediv se.
Pokud to pořád není jasné, tak hardwarově vygenerované certifikáty jsou podmnožina jakýchkoliv certifikátů.
Tak teď jste tomu dal na prdel, kolego. Na specializovaném zařízení se negeneruje certifikát, ale privátní klíč, kterým se pak certifikát podepisuje. Z hlediska procesu vydávání certifikátu je jednu, jakým způsobem byl klíč vygenerovaný. Z hlediska síly klíče zde ale je diametrální rozdíl mezi kvalitou klíče vygenerovaného nějakou aplikací a kvalitou klíče vygenerovaném na speciálním hardwaru.
Takže není jedno, na čem se bude klíč generovat.
>Pokud to pořád není jasné, tak hardwarově vygenerované certifikáty jsou podmnožina jakýchkoliv certifikátů.
A to, že je něco podmnožinou něčeho vypovídá o vlastnostech, kvalitě a nekvalitě?
Ad b) Díky.
Ad a) libnss umí PKCS#11 (Firefox, Chrome), Windows asi taky nějak (IE). Ve Firefoxu je to pod "Security Devices", ale nikdy jsem si s tím nehrál, takže jen předpokládám, že Vám rozhodně nic nebrání přidat si do systému poskytovatele PKCS#11, zintegrovat jej s prohlížečem. A pak už je to jen podmnožina b).