netsh http sslcert
Netshelový příkaz k práci s SSL certifikáty služby inetsrv, neboli IIS serveru. Když jsem si uvědomil, že (všechnu?) komunikaci http protokolu zajišťuje IIS server – nebo alespoň jeho jádro, došla mi spousta důsledků. Tímto příkazem se dají totiž nastavit certifikáty pro další služby běžící na SSL. V tomto příspěvku ukáži některé z nich.
Tento netshell příkaz lze – jako jiné řádkové příkazy – používat ve vzdálené powershell session (PS relaci), takže je imořádně vhodný pro nastavení SSL bindů na core serverech!
HTTPS bind pro IIS web server.
Celý postup je totožný s postupem uvedeným v článku Jak naimportovat SSL certifikát pro Windows Admin Center s tím rozdílem, že neinstalujeme certifikát pro WADMIN server, ale pro IIS web server. Stačí, když si vypíšete SSL bindy, nahlédnete, že přes remote PowerShel Session je řešení elegantní a přímočaré. (Žádné prohrabávání se ve vlastnosti jednotlivých sajt (sites)!
Poznámka navíc: mezi SSL bindy naleznete též výpis:
IP:port : 0.0.0.0:8172 Certificate Hash : 9741c551e559196bd4f33e0f94774dcf2522a95a Application ID : {00000000-0000-0000-0000-000000000000} . . . Max Settings Per Minute : 4294967295
Zastříhejte ušmama – co je to za port?! No přeci ISS management! A to je taky jediný způsob, jaxi nastavit certifikát pro tuto službu – abyste nemuseli řešit nějaký podezřelý self-signed certifikát, zejména při práci s inetmgr.exe na vzdáleném počítači!
A to doopravdy dělá to samé, co GUI? Ne tak docela. Jeden rozdíl jsem našel:
SSL Certificate bindings: ------------------------- IP:port : 0.0.0.0:443 Certificate Hash : cc8780b99c37b92de87daaf3534b82bcb36eac78 Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled . . .
U vlastnosti Certificate Store Name je hodnota (null), zatímco pokud instalujete certifikát přes GUI, hodnota je MY. (Jasně: z cesty cert:\localmachine\MY). Ve vlastnostech serveru při připojení přes browser jsem nezaznamenal rozdíl… Je pravdou, že v příkazu netsh http add sslcert …. jsem zadal pouze otisk (thumbprint) certifikátu z cert:\localmachine\MY bez uvedení cesty. Ale nejsem si ani jist, zda příkaz nějaký parametr typu certpath obsahuje….
Nastavení certifikátu pro Remote Desktop Gateway
Toto řešení jsem hledal již delší dobu, neb na RDG používám veřejné certifikáty firmy Digicert. Jejich drobnou nevýhodou je, že mají životnost 3 měsíce. Tudíž alespoň drobná úleva ve formě skriptu je vítaná.
SSL připojení RDG je ralizováno opět službou inetsrv, takže postup je opět stejný, jako v článku Jak naimportovat SSL certifikát pro Windows Admin Center. Při výpisů SSL bindů byste měli mít právě jeden – a tak je situace jednodušší!
Rozdíly oproti použití GUI: pokud si vypíšete přes Remote Desktop Gateway Management připojený ke vzdálenému počítači vlastnosti RDG, ihned vás praští mezi oči, že na záložce SSL certifikátu nemáte žádný certifikát! Dokonce i na stránce dashboardu máte červený křížek s chybou hlásající, že chybí SSL certifikát! Opět: službu zkouším takto nastavenou – a funguje bezvadně. Navíc: při výměne certifikátu přes GUI jsem musel minimálně jednou, ale zpravidla vícekráte restartovat RDG server, než se přes něj dalo připojit. Při výměně přes netsh http add sslcert … jsem ani neobdržel hlášku o restartu čehokoliv a připojování klientů fachalo v tu ránu beze ztráty kytičky…..
Pokud užíváte SNI (Server Name Indication), lépe než parametr IPPORT poslouží HOSTNAMEPORT. V tomto případě je nutné uvést i parametr CERTSTORENAME, takže celý příkaz vypadá asi takto:
netsh http add sslcert HostnamePort=www.firma1.cz:443 CertHash=xxxxxxxxxxxxxxxxxx AppId=“{xxxxx-xx-xxxxxxxx}“ CertStoreName=MY
Zaboha jsem nemohl nainstalovat certifikát pro správu webu (ipport=0.0.0.0:8172). Prostě proto, že jsem zapoměl úvozovky u parametru AppId=“{……}“ . Málem jsem se vzteknul !!!