Instalace SSL na IIS a nastavení ASP.NET MVC aplikace pro podporu HTTPS
Tento článek byl napsán v roce 2015. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
Už máte implementován SSL certifikát a běží vám webová aplikace na HTTPS? Pokud ne, ukážu vám v tomto článku, jak instalovat SSL certifikát na server a rozjet webovou aplikaci (ASP.NET MVC) na HTTPS v prostředí Windows Azure (Cloud Service). Postup se dá s drobnými technologickými rozdíly (a pro technicky zdatnější uživatele to nebude problém) aplikovat i na Azure WebSites.
Volba certifikační autority
Tento krok je netechnický. Jde v podstatě jen o to, jaký typ certifikátu potřebujete. Všechny SSL certifikáty plní stejný účel, nicméně existují různé typy certifikátů, které se liší v několika parametrech:
- chování v prohlížečích
- způsob ověření
- doba vystavení
- platnost
- cena
Asi nejzásadnějším parametrem je kupodivu ten první. Druh certifikátu totiž rozhoduje o tom, zda se v prohlížeči pouze zobrazí zámeček s https nebo například zelené pozadí vyhledávacího pole s názvem certifikační autority. Já na tomto svém blogu používám nejlevnější certifikát RapidSSL, který pořídíte za pár stovek. Jeho výhodou je i ověření na základě vlastnictví domény a vydání do 2 minut.
Na druhé straně spektra jsou například certifikáty Symantec (původně VeriSign), které patří mezi obecně velmi důvěryhodné ale jejich cena se pohybuje v desetitisících korunách. Volba je na vás.
Žádost o vydání certifikátu
Prvním krokem je žádost o vydání certifikátu na straně certifikační autority. V tento moment již musíte vědět, pro jakou doménu chcete certifikát aplikovat. Důležité je, že domény http://www.miroslavholec.cz
a http://miroslavholec.cz
jsou považovány jako dvě odlišné. Obvykle se v aplikacích provádí redirect na verzi s www a certifikát se kupuje právě pro tuto verzi. Na konci tohoto kroku byste měli mít vytvořený účet u vybrané certifikační autority, např.: geotrust, sslmarket, symantec. Já budu přidávat screeny z rozhraní sslmarket.
Certificate Signing Request
Po registraci u vaší certifikační autority je potřeba vygenerovat tzv. Certificate Signing Request (TXT/CSR). Jedná se o obyčejný txt soubor s veřejným klíčem a dalšími údaji o držiteli a certifikační autoritě (někdy pouze veřejný klíč). Kdybychom si zřizovali například elektronický podpis, vygeneruje nám tento soubor certifikační autorita. V našem případě jej musíme vytvořit sami, ideálně na serveru, kde je hostovaná zvolená doména.
Tady ale pozor. V případě Azure Cloud Services existuje více prostředí, která neustále vznikají / zanikají a pokud bychom generovali request na takovém serveru, dost možná bychom už nebyli schopni proces dokončit. Nutné je proto vytvořit si CSR na vývojářském / lokálním serveru.
- spustíte IIS manager
- hned na úvodní obrazovce v sekci IIS vyberete Server Certificates
- po pravé straně v menu Actions vybrat Create Certificate Request
- vyplní se okno informacemi o držiteli aj., a vybere Next
- ponechá se obvykle stávající Cryptoprovider, tedy MS RSA / 1024 bit
- vybere se místo, kam se má uložit TXT soubor a zvolí se Finish
Uložení veřejného klíče
Nyní je potřeba vygenerovaný veřejný klíč uložit. Z TXT, případně CSR souboru obvykle stačí zkopírovat text od -----BEGIN NEW CERTIFICATE REQUEST----- až po -----END NEW CERTIFICATE REQUEST----- a tento obsah vložit někam do administrace u certifikační autority. Naposledy je vhodné zkontrolovat správnost domény, klíče a držitele.
Ověření držitele
CSR se uloží a obvykle je potřeba v dalším kroku zvolit email pro ověření SSL certifikátu. Je užitečné mít pro tyto účely založený nějaký administrační email, standardně: admin@miroslavholec.cz. Pokud jej nemáte, budete jej muset nejspíš vytvořit. Očekává se (vlastně vyžaduje), že vlastníte doménu a vytvoření emailu tak pro vás nebude problém. Mohou následovat i další způsoby ověření - pomocí telefonního čísla (to dělá např.: GeoTrust). Výsledkem tohoto kroku musí být:
- uložený CSR na straně certifikační autority
- ověření držitele (emailem, telefonicky, atd.)
Stažení a instalace certifikátu na server
Po úspěšném ověření dostanete od certifikační autority konečně SSL certifikát. Tato část se může lišit podle certifikační autority a serveru, kam chcete certifikát instalovat. Dále v tomto článku popisuji variantu instalace GeoTrust / RapidSSL / Symantec na IIS běžíci na Windows Server 2003+.
Od CA máme dostupný certifkát ve formátu PKCS#7. Buď ho uložíme nebo zkopírujeme obsah a následně přeuložíme jako certificate.P7B (eventuelně TXT). Na obrázku níže vidíte můj případ před pár měsíci: CSR jsem uzavíral s pomocí toho prvního txt souboru.
Nyní je potřeba dokončit instalaci na stejném serveru, na němž byl původně vygenerován CSR.
- spustíte IIS manager
- na úvodní obrazovce opět do Server Certificates
- po pravé straně v menu Actions vybrat Complete Certificate Request
- dále už se řídit pokyny (next, next, next...)
Toto je asi nejkritičtější krok celého procesu, kde dochází k chybám. Teď už nezbývá než přenést certifikát do produkce. Přikládám ještě odkazy na návody v případě jiných konfigurací nebo v případě problémů.
Přenesení certifikátu do produkce
Pokud všechno dopadlo dobře, je nyní potřeba na seznamu certifikátů v IIS vybrat ten s dokončením CSR a provést export. Stačí na certifikát kliknout pravým myšítkem a vybrat Export. Dobře si poznamenejte heslo, které bude vyžadováno, budete ho ještě potřebovat. Nyní byste měli mít certifikát *.CER
uložený na nějakém bezpečném místě.
Certifikát se dále musí nahrát na Windows Azure Cloud Service prostředí.
- Přejdeme do administrace Windows Azure
- Vybereme Cloud Services a následně konkrétní službu
- Vybereme poslední záložku Certificates
- Provedeme upload přes tlačítko Upload
Ve čtvrtém kroku bude potřeba heslo, které jsme si zvolili při exportu certifikátu z lokálního IIS. Po úspěšném uploadu uvidíte mezi certifikáty něco v tomto smyslu:
Uložte si do clipboardu THUMBPRINT, který bude potřeba během nastavení aplikace.
Nastavení webové aplikace pro HTTPS
Máme na serveru certifikát ale aplikace samozřejmě stále běží na HTTP. Pro nastavení je nutné přidat endpoint, certifikát a zajistit přesměrování z HTTP na HTTPS.
Přidání endpointu a certifikátu
Díky tomuto kroku nastavíme endpoint pro HTTPS, nastavíme port a připojíme tzv. certificate thumbprint, který jsme získali po uploadu certifikátu na Azure.
- Otevřete si běžným způsobem Solution s vaším webem ve Visual Studiu
- Přejdeme do nastavení webové role
- V první záložce Configuration zaškrtneme mezi startup actions HTTPS endpoint
- V záložce Certificates se přidá nový certifikát
- V záložce endpoints se nakonec přidá nový HTTPS endpoint s portem 443 a přiřadí certifikát dle názvu.
Aplikace po nasazení bude pracovat s certifikátem, který je uložen v LocalMachine/My (tedy na produkčním stroji). Nemusíme pro to dělat vůbec nic, Azure sám zařídí, aby v tomto umístění byl certifikát přítomen, na základě uploadu, který jsme v minulých krocích udělali.
Přesměrování HTTP - HTTPS
Nakonec nezbývá než zajistit, aby se všechny požadavky na stránky s HTTP přesměrovali na verzi s HTTPS.
Nejprve se vytvoří vlastní filtr s pomocí RequireHttpsAttribute
public class RequireSslAttribute : RequireHttpsAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext == null) throw new ArgumentNullException("filterContext"); if (filterContext.HttpContext.Request.IsLocal) return; base.OnAuthorization(filterContext); } }
a ten se následně globálně zaregistruje
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new RequireSslAttribute()); } }
Pokud chceme navíc přesměrovat všechny požadavky na verzi s www, můžeme tak učinit opět pomocí filtru nebo přímo v global.asax.cs
. Toto je jedno z řešení, byť asi ne úplně elegantní.
protected void Application_EndRequest(object sender, EventArgs e) { RedirectRequestsToHttps(); } private void RedirectRequestsToHttps() { if ((!Request.IsLocal) && (!Request.Url.AbsoluteUri.ToLower().Contains("cloudapp"))) { if (Request.Url.AbsoluteUri.ToLower().StartsWith("http://mojedomena.cz/")) Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace("http://mojedomena.cz/", "https://www.mojedomena.cz/")); if (Request.Url.AbsoluteUri.ToLower().StartsWith("https://mojedomena.cz/")) Response.Redirect(Request.Url.AbsoluteUri.ToLower().Replace("https://mojedomena.cz/", "https://www.mojedomena.cz/")); }
Pro nastavení cookies nebo zabezpečených auth cookies aj. ještě doporučuji tento článek, kde je všechno srozumitelně popsáno.
Deploy
Nezbývá než aplikaci nasadit do produkce. Okamžitě by měly fungovat redirecty na verzi s HTTPS a ta by měla využívat certifikát, který jsme nahráli na Azure a nastavili pro webovou roli.
Závěr
Vzhledem k nízké ceně certifikátů a jejich přínosu, ať už z hlediska bezpečnosti nebo důvěryhodnosti, doporučuji vážně nad implementací HTTPS pouvažovat. Věřím, že tento článek dostatečně nastínil princip instalace SSL certifikátu na webový server včetně nastavení MVC aplikace pro podporu HTTPS protokolu. Proces se může zdát komplikovaný ale ve skutečnosti nezabere více než pár hodin.