Skrytá past v SSL wildcard certifikátu

Použití SSL wildcard certifikátu je vhodné např. do testovacích či vývojových prostředí webových farem, kde je sice žádoucí používat SSL, ale není nutné vytvářet identitu pro každý web. SSL wildcard certifikát se pozná snadno – neobsahuje IP adresu či FQDN název, ale je to třeba *.mujweb.cz. Na Windows Serveru 2003 je k dispozici od SP1 pod názvem SSL Host Headers. Prvně jsem se o nich dočetl zde. Postupem času jsem byl nucen zdokonalit Martinem popsané postupy, ale než se k nim dostanu – v čem je ta skrytá past?

Každý certifikát jednou expiruje. Dobrý admin jej vymění ještě před datem expirace, ten horší až po něm – no a admin ignorant reaguje až v momentě, kdy jej prudí uživatelé nebo helpdesk :) Náročnost výměny certifikátu je individuální – nejjednodušší je samozřejmě online dostupná CA.

Je nutné si pamatovat, že po výměně SSL wildcard certifikátu je potřeba OPĚTOVNĚ projít Secure Bindings všech dotčených webů v metabázi a znovu je nastavit. Výměna certifikátu v GUI IIS Manageru totiž smaže tyto ruční vychytávky, takže po provedení IISRESET (či restartu serveru) jsou všechny dotčené servery ve stavu Stopped a v System Event logu se objevuje hláška podobná této:

Event Type:    Error
Event Source:    W3SVC
Event Category:    None
Event ID:    1007
Date:        25.9.2008
Time:        14:15:50
User:        N/A
Computer:    SERVER
Description:
Cannot register the URL prefix 'https://192.168.0.50:443/' for site '1408373699'. The necessary network binding may already be in use. The site has been deactivated.  The data field contains the error number.

Tak a nyní k těm vylepšením Martinova textu. Nejdříve SecureBindings pro případ, kdy webový server obsahuje víc IP adres, přičemž na každé IP adrese může být použit jiný SSL wildcard certifikát. V případě nasazení na server, který má přiděleno více IP adres je nutné bod 2 modifikovat:

cscript.exe adsutil.vbs set /w3svc/<site identifier>/SecureBindings "aaa.bbb.ccc.ddd:443:<host header>"

- kde host header je host header dané web site, např. www.mujweb.cz
- kde aaa.bbb.ccc.ddd je IP adresa, na které je web spuštěn

Kontrola pomocí příkazu

cscript adsutil.vbs get /w3svc/1408373699/SecureBindings
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
SecureBindings                  : (LIST)  (1 Items)
  "192.168.0.50:443:www.mujweb.cz"

Druhé rozšíření se týká přesměrování HTTP požadavků na SSL variantu. Martin uvádí pouze ASP variantu, občas se mi hodila i ASPX varianta (v C# a bez code-behind, protože code-behind by vyžadoval kompilaci v každém projektu):

<%@ Page language="c#" AutoEventWireup="false" %>
<%

  string cQueryString = "";
  try{cQueryString = Request.QueryString.ToString();}
  catch{}
  cQueryString = Server.UrlDecode(cQueryString);
  string cAddress = cQueryString.Substring(cQueryString.IndexOf(";") + 1, cQueryString.Length - cQueryString.IndexOf(";") - 1);
  cAddress = cAddress.Replace("http://", "https://");
  cAddress = cAddress.Replace(":80", ":443");
  if(string.Equals(cAddress, "")) cAddress = "index.aspx";
  Response.Redirect(cAddress);
  Response.End();
%>

Zobrazit komentáře