Let's Encrypt – Váš příští certifikát pro IIS/RDP?

Let’s Encrypt je poměrně mladá certifikační autorita, která zdarma poskytuje důvěryhodné Domain Validated SSL/TLS certifikáty. Certifikáty zdarma můžete také získat od StartSSL nebo WoSign, ale výhodou Let’s Encrypt je plná automatizace procesu díky protokolu ACME (StartSSL plánuje uveřejnit StartAPI, které by mělo poskytovat podobné možnosti jako Let’s Encrypt, ale v současné době není dostupné).

Všichni jsme ale už naučeni nevěřit reklamám a novým nezaběhnutým projektům a proto se zaměříme především na to, co nefunguje podle představ a ukážeme si jak začít používat Let’s Encrypt na Windows co nejefektivněji.

Co čekat od Let’s Encrypt

Důvěryhodný Domain Validated certifikát s platností 90 dnů (tato doba se může v budoucnu zkrátit).

Jednoznačným a správným cílem je automatizace. Správce, který 1x ročně obnoví certifikát na několika serverech na to buď zapomene nebo bude každoročně hledat způsoby jak se certifikát obnovuje a aktualizuje pro jednotlivé služby.

Nutnost spouštět agenta pro obnovení certifikátu na počítači, který umožní zprostředkovat odpověď serverům Let’s Encrypt (pokud nevyužijete validaci pomocí DNS záznamu, případně jiný způsob jak publikovat na vašem webu příslušný ověřovací řetězec).

Nic nebrání následnému exportu certifikátu a jeho importu na další počítače.

Přidávání dalších funkcí podle specifikací protokolu ACME.

Všechny nové funkce můžete sledovat přímo na stránkách Let’s Encrypt, přičemž jejich případná implementace do klientů trvá několik měsíců.

Pro jednu doménu je možné žádat maximálně o 20 certifikátů za týden.

Implementace na Windows

Certify

Pro systém Windows existují 3 různé způsoby, jak získat certifikát od Let’S Encrypt, přičemž všechny jsou založeny na .NET knihovně ACMESharp. Pro občasné uživatele najde uplatnění klient Certify, který poskytuje grafické uživatelské rozhraní, přičemž jeho poslední verze byla vydána 29. 3. 2016.

20160713_1

letsencrypt-win-simple

Pokud chcete využít možnosti příkazové řádky, tak se nabízí klient letsencrypt-win-simple. Sám jsem se bohužel setkal u poslední verze 1.9.1 z 20. 5. 2016 s problémem, kdy IIS nebyla schopná odpovědět dostatečně rychle a klient vypsal po 2 pokusech chybu (celkový čas mezi pokusy byl 1-3 sekundy).

20160713_2

ACMESharp

Zbývá nám tedy poslední varianta a tou je využití PowerShellu. Poslední verze 0.8.1.0 je z 29. 1. 2016. Už jen z čísla verze můžeme očekávat jisté obtíže. První nastane již při stažení samotného balíčku ACME-posh.zip, který neobsahuje všechny potřebné soubory, které jsou v jiných distribučních balíčcích pro Chocolatey nebo v PowerShell Gallery. Konkrétně chybí 7 souborů:

  • ACMESharp.POSH-test.dll
  • ACMESharp.POSH-test.pdb
  • ACMESharp.Providers.AWS.dll
  • ACMESharp.Providers.AWS.pdb
  • ACMESharp.Providers.IIS.dll
  • ACMESharp.Providers.IIS.pdb
  • Microsoft.Web.Administration.dll

Chybějící soubory získáme jednoduše stažením souboru acmesharp-posh-all.0.8.1.0.nupkg, změnou přípony nupkg na zip ze složky source\ACMESharp\ zkopírujeme potřebné soubory. Pokud už máte PowerShell v5 tak můžete využít jednoduchý příkaz pro jeho stažení a instalaci a nemusíte řešit problém s chybějícími
soubory.

 Install-Module -Name ACMESharp

Instalace modulu

Stažený zip soubor si rozbalíme a složku ACMESharp nakopírujeme do složky c:\Program Files\WindowsPowerShell\Modules\. Dále ze složky ACMESharp přesuneme složky ACMESharp-IIS a ACMESharp-AWS do nadřazené složky, abychom mohli následně tyto moduly importovat.

20160713_3

Následně si otevřeme PowerShell a pomocí příkazu Import-Module si moduly naimportujeme.

 Import-Module ACMESharp<br>Import-Module ACMESharp-IIS

Generování certifikátu

Následující skript provede generování certifikátu a jeho instalaci do IIS. Nejdříve si definujeme proměnné které budeme dále využívat. První tři jsou doménová jména, která chceme mít v certifikátu. Další položkou je email, který je třeba zadat a Let’s Encrypt na něj může zaslat důležitá oznámení, která se týkají funkčnosti služby. Dále si vytvoříme složku, do které budeme exportovat pfx soubor a alias, který budeme používat pro právě tvořený certifikát. Tato proměnná obsahuje dnešní datum pro případnou jednodušší manipulaci s pfx soubory. Alias, který se následně používá pro odeslání žádosti o certifikát nesmí začínat číslem – pokud začíná číslem, tak to vede k chybě a žádost o certifikát se neodešle.

 $domain = "domena1.contoso.com"
$domain2 = "domena2.contoso.com"
$email = "email@outlook.com"
$vault = "C:\inetpub\vault\{0}" -f $domain
$als = "$domain" + "$((Get-Date).Day)" + "." + "$((Get-Date).Month)" + "." + "$((Get-Date).Year)"
mkdir $vault
cd $vault

Následně provedeme inicializaci úložiště certifikátů, které si tento PowerShellový modul tvoří ve složce C:\ProgramData\ACMESharp\sysVault a provedeme ověření pro naše dvě domény pomocí HTTP dotazu. V případě, že byste chtěli využít pro ověření HTTPS, je nutné směrovat na server i port 80 a provést přesměrování pomocí URL rewrite. Není možné vynutit HTTPS zaškrtnutím Požadovat protokol SSL – poté se ověření neprovede a je nutné přesměrování na HTTPS provádět pomocí URL rewrite.

 Initialize-ACMEVault -BaseURI https://acme-v01.api.letsencrypt.org/ 
 New-ACMERegistration -Contacts mailto:$email -AcceptTOS
 # DNS1
New-ACMEIdentifier -Dns $domain -Alias dns1
Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
Submit-ACMEChallenge dns1 -ChallengeType http-01
(Update-ACMEIdentifier dns1 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}
# DNS2
New-ACMEIdentifier -Dns $domain2 -Alias dns2
Complete-ACMEChallenge dns2 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
Submit-ACMEChallenge dns2 -ChallengeType http-01
(Update-ACMEIdentifier dns2 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}

Posledním krokem je samotné vygenerování žádosti a její odeslání Let’s Encrypt a následná instalace certifikátu do IIS. Cmdlet Install-ACMECertificateToIIS by měl provést veškeré kroky, ale import do lokálního úložiště certifikátů je v současné verzi nefunkční a tudíž je třeba toto vyřešit před spuštěním tohoto cmdletu.

 New-ACMECertificate dns1 -Generate -AlternativeIdentifierRefs ([array]$('dns2')) -Alias $als
Submit-ACMECertificate $als
Update-ACMECertificate $als
Get-ACMECertificate $als -ExportPkcs12 "C:\inetpub\vault\$domain\$als.pfx"
Import-PfxCertificate "C:\inetpub\vault\$domain\$als.pfx" cert:\localMachine\my
Install-ACMECertificateToIIS $als -Replace -WebSite "Default Web Site"
Remove-Item "C:\inetpub\vault\$domain\$als.pfx" -Force

Celý skript ještě jednou nerozdělený.

 Import-Module ACMESharp
Import-Module ACMESharp-IIS
$domain = "domena1.contoso.com"
$domain2 = "domena2.contoso.com"
$domain3 = "domena3.contoso.com"
$email = "email@outlook.com"
$vault = "C:\inetpub\vault\{0}" -f $domain
$als = "$domain" + "$((Get-Date).Day)" + "." + "$((Get-Date).Month)" + "." + "$((Get-Date).Year)"
mkdir $vault
cd $vault
Initialize-ACMEVault -BaseURI https://acme-v01.api.letsencrypt.org/ 
New-ACMERegistration -Contacts mailto:$email -AcceptTOS
# DNS1
New-ACMEIdentifier -Dns $domain -Alias dns1
Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
Submit-ACMEChallenge dns1 -ChallengeType http-01
(Update-ACMEIdentifier dns1 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}
# DNS2
New-ACMEIdentifier -Dns $domain2 -Alias dns2
Complete-ACMEChallenge dns2 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
Submit-ACMEChallenge dns2 -ChallengeType http-01
(Update-ACMEIdentifier dns2 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}
New-ACMECertificate dns1 -Generate -AlternativeIdentifierRefs ([array]$('dns2')) -Alias $als
Submit-ACMECertificate $als
Update-ACMECertificate $als
Get-ACMECertificate $als -ExportPkcs12 "C:\inetpub\vault\$domain\$als.pfx"
Import-PfxCertificate "C:\inetpub\vault\$domain\$als.pfx" cert:\localMachine\my
Install-ACMECertificateToIIS $als -Replace -WebSite "Default Web Site"
Remove-Item "C:\inetpub\vault\$domain\$als.pfx" -Force
Import certifikátu do Remote Desktop Services

Pokud využíváte Remote Desktop Services ve Windows Server 2012 a novějších, jistě vás potěší, že je možné využít certifikát od Let’s Encrypt také pro vzdálenou plochu. Na serveru, kde provozujete RDWeb je nutné provést nejdříve import do IIS a následně importovat tento nový certifikát i do Remote Desktop Services pomocí následujících příkazů.

 Import-Module ACMESharp
Import-Module ACMESharp-IIS
$domain = "domena1.contoso.com"
$als = "$domain" + "$((Get-Date).Day)" + "." + "$((Get-Date).Month)" + "." + "$((Get-Date).Year)"
Get-ACMECertificate $als -ExportPkcs12 "C:\inetpub\vault\$domain\$als.pfx"
$cb = "server"
Set-RDCertificate -Role RDGateway -ImportPath "C:\inetpub\vault\$domain\$als.pfx" -ConnectionBroker $cb -Force
Set-RDCertificate -Role RDWebAccess -ImportPath "C:\inetpub\vault\$domain\$als.pfx" -ConnectionBroker $cb -Force
Set-RDCertificate -Role RDRedirector -ImportPath "C:\inetpub\vault\$domain\$als.pfx" -ConnectionBroker $cb -Force
Set-RDCertificate -Role RDPublishing -ImportPath "C:\inetpub\vault\$domain\$als.pfx" -ConnectionBroker $cb -Force
Remove-Item "C:\inetpub\vault\$domain\$als.pfx" -Force

Stojí to za to?

Určitě ano! Ať už se rozhodnete využívat Let’s Encrypt, v budoucnu StartAPI nebo nějakou jinou službu, přinese vám využití automatizace více času na rozvoj Vámi spravovaných a poskytovaných služeb. Nezabývejte se jednoduchými úlohami, které za vás můžou vyřešit skripty.

Pokud by vás zajímala konkrétní implementace Let’s Encrypt pro nějaký scénář, napište do diskuze a případně napíšu článek přímo na míru Vašim potřebám.

 

– Jiří Janata, MSP (Microsoft Student Partner)