Miroslav Holec
Premium

Instalace SSL na IIS a nastavení ASP.NET MVC aplikace pro podporu HTTPS

Miroslav Holec   13. ledna 2015  update 21. září 2016

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:

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.

RapidSSL certifikát v prohlížeči

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.

GeoTrust certifikát v prohlížeči

Žá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.

  1. spustíte IIS manager
  2. hned na úvodní obrazovce v sekci IIS vyberete Server Certificates
  3. po pravé straně v menu Actions vybrat Create Certificate Request
  4. vyplní se okno informacemi o držiteli aj., a vybere Next
  5. ponechá se obvykle stávající Cryptoprovider, tedy MS RSA / 1024 bit
  6. 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.

Certifikát p7b ke stažení

Nyní je potřeba dokončit instalaci na stejném serveru, na němž byl původně vygenerován CSR.

  1. spustíte IIS manager
  2. na úvodní obrazovce opět do Server Certificates
  3. po pravé straně v menu Actions vybrat Complete Certificate Request
  4. 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í.

  1. Přejdeme do administrace Windows Azure
  2. Vybereme Cloud Services a následně konkrétní službu
  3. Vybereme poslední záložku Certificates
  4. 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:

Azure Cloud Service Certificates

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

Certifikát v nastavení Azure role

  • V záložce endpoints se nakonec přidá nový HTTPS endpoint s portem 443 a přiřadí certifikát dle názvu.

Nastavení endpointů v .NET aplikaci

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.