SoftEther + Let's Encrypt

Nedávno nám Jirka představil Let's Encrypt a já jsem krátce uvedl možnosti využití SoftEther VPN. V tomto článku si ukážeme, jak jednoduše tyto dvě řešení propojit - tedy aby SoftEther využíval certifikáty od Let's Encryptu pro šifrování VPN.

A proč to kombinovat? Důvod je jednoduchý - pokud se chcete z počítače připojovat na VPN pomocí SSTP protokolu, musí váš počítač důvěřovat cerrtifikátu, kterým se server prezentuje. To můžete buď docílit tím, že do koncových počítačů nainstalujete certifikát vlastní CA, využijete certifikát nějaké komerční či nekomerční CA nebo využijete certifikát zdarma od Let's Encrypt. Nevýhodou řešení s využitím Let's Encrypt je to, že si musíte vytvořit vlastní skript, který se bude starat o obnovu a nastavení certifikátu do VPN, na druhou stranu je pak velmi jednoduché měnit domény a nemusíte pak nadále řešit například to, že se vám blíží vypršení certifikátu, jelikož se certifikát sám obnoví. Napsal jsem, že si musíte vytvořit vlastní skript - to nutně není pravda, jsem zastáncem toho, že není potřeba vytvářet něco, co už existuje, takže s vámi skript, včetně postupu pro nastavení nasdílím.

Jako klienta pro Let's Encrypt jsem si vybral letsencrypt-win-simple. To stejné byste mohli například docílit i s pomocí ACMESharp či dalších. Výhodou je, že si většina klientů po prvním získání certifikátu automaticky vytvoří úlohu na pozadí, které se pak starají o obnovení certifikátu před vypršením.

Jakmile máme certifikát, je potřeba ho nasadit do SoftEtheru - to samozřejmě můžete udělat pomocí grafického rozhraní, ale jelikož naším cílem je, aby se certifikát obnovoval sám na pozadí a následně aplikoval, podíváme se jak toho docílit pomocí příkazové řadky. SoftEther totiž nabízí tzv. VPNCMD, což je CLI pro SoftEther, které vám umožňuje veškeré funkcionality (jak serveru, tak i klienta) ovládat právě skrze příkazovou řádku nebo případně pomocí skriptů. Můj skript pro nastavení certifikátu do SoftEtheru vypadá takto:

 cd C:\Program Files\SoftEther VPN Server\
vpncmd_x64.exe localhost:5555 /SERVER `
/PASSWORD:"***" `
/CMD ServerCertSet `
/LOADCERT:"%APPDATA%/letsencrypt-win-simple/httpsacme-v01.api.letsencrypt.org/domena-crt.pem" `
/LOADKEY:"%APPDATA%/letsencrypt-win-simple/httpsacme-v01.api.letsencrypt.org/domena-key.pem"

Tímto způsobem jsme tedy nastavili nový certifikát do SoftEtheru, který nám vygeneroval Let's Encrypt. Nyní stačí jenom vytvořit dávkový soubor, s ním pak plánovanou úlohu (která běží v kontextu stejného uživatele jako ta od letsencrypt-win-simple) a máme hotovo. Jelikož Let's Encrypt certifikát vyprší po 90 dnech, letsencrypt-win-simple certifikát obnovuje automaticky dopředu a my bychom to měli také zohlednit v plánované úloze. To jsem vyřešil tak, že úloha s nastavením certifikátu do SoftEtheru se pouští každý den - není to zrovna ideální řešení už jen proto, že dokola nastavujeme stejný certifikát, dokud se neobnoví (nicméně to nemá vliv na funkci VPN server, výměna certifikátu je totiž bezvýpadková), ale pro účely mého použití to bohatě stačí. Lehce elegantnější řešení by bylo zahrnout obnovu certifikátu do stejného skriptu, takže by se certifikát hned po obnově aplikoval, nebo třeba kontrolovat, zda se soubory s certifikátem v poslední době nezměnily apod.

Ve svém článku jsem také poznamenal, že jsem nedávno přemigroval SoftEther z Windows na Raspberry, kde to celé řeším velmi podobně, ukázkový skript pro Raspberry/Linux můžete najít třeba zde.