Tento tutoriál vám ukáže, jak nastavit ověřování certifikátů na serveru OpenConnect VPN (ocserv) na Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) je open-source implementace protokolu Cisco AnyConnect VPN.
V předchozím článku jsem vysvětlil kroky k nastavení serveru OpenConnect VPN s certifikátem serveru Let's Encrypt TLS. Let’s Encrypt nevydává klientský certifikát, takže v tomto článku jsme použili ověřování heslem. Pokaždé zadávat uživatelské jméno a heslo může být obtížné, zvláště pokud klientský software, jako je aplikace Cisco AnyConnect pro iOS, nenabízí možnost zapamatovat si hesla. Mnoho klientského softwaru OpenConnect umí importovat uživatelské certifikáty, které uživatele osvobodí od zadávání uživatelského jména a hesla. Ověření certifikátem je také bezpečnější než ověřování heslem.
Požadavky
Chcete-li postupovat podle tohoto návodu, předpokládá se, že jste již nastavili server OpenConnect VPN s certifikátem serveru Let's Encrypt TLS. Pokud ne, postupujte podle jednoho z následujících výukových programů.
- Nastavte OpenConnect VPN Server (ocserv) na Ubuntu 20.04 pomocí Let’s Encrypt
- Nastavte OpenConnect VPN Server (ocserv) na Debian 11 Bullseye pomocí Let’s Encrypt
- Nastavte OpenConnect VPN Server (ocserv) na CentOS 8/RHEL 8 pomocí Let’s Encrypt
Založíme vlastní CA (Certifikační autoritu) k podepisování klientského certifikátu. ocserv
démon by měl nadále používat certifikát serveru TLS vydaný společností Let’s Encrypt, takže klientský software nebude zobrazovat bezpečnostní varování.
Nastavení vlastní CA (certifikační autority)
Chceme použít autentizaci certifikátem, ale Let’s Encrypt nevydává klientský certifikát, takže si musíme vytvořit vlastní CA. Můžete použít openssl
aby to udělal, ale ocserv doporučuje GnuTLS, takže vám ukážu, jak GnuTLS používat.
Nainstalujte gnutls-bin
balíček na serveru Debian/Ubuntu.
sudo apt install gnutls-bin
Nainstalujte gnutls-utils
balíček na CentOS/RHEL.
instalace sudo dnf gnutls-utils
Vytvořte podadresář v /etc/ocserv/
k držení soukromých klíčů a certifikátů.
sudo mkdir /etc/ocserv/ssl/
Změňte svůj pracovní adresář.
cd /etc/ocserv/ssl/
Vygenerujte soukromý klíč pro CA pomocí certtool
příkaz, který poskytuje gnutls-bin
nebo gnutls-utils
balík. Ve výchozím nastavení generuje 3072bitový klíč RSA, což je dostatečné.
sudo certtool --generate-privkey --outfile ca-privkey.pem
Před vygenerováním certifikátu CA vytvořte soubor šablony certifikátu CA. Formát souboru šablony lze nalézt v příručce certtool (man certtool
).
sudo nano ca-cert.cfg
Přidejte do souboru následující řádky. Nahraďte zástupné symboly příslušnými hodnotami.
# X.509 Certificate options# Organizace předmětu.organizace ="vpn.example.com"# Běžný název vlastníka certifikátu.cn ="Příklad CA"# Sériové číslo certificate.serial =001# Za kolik dní, počítáno ode dneška, vyprší platnost tohoto certifikátu. Použijte -1, pokud neexistuje datum vypršení platnosti.expiration_days =-1# Zda se jedná o certifikát CA nebo neca# Zda bude tento certifikát použit k podepsání datasigning_key# Zda bude tento klíč použit k podepsání dalších certifikátů.cert_signing_key# Zda tento klíč se použije k podepsání CRLs.crl_signing_key
Uložte a zavřete soubor. Nyní vygenerujte certifikát CA pomocí konfigurací ze souboru šablony.
sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem
Nyní máme soubor certifikátu CA (ca-cert.pem
).
Generování klientského certifikátu
Nyní spusťte následující příkaz pro vygenerování soukromého klíče klienta.
sudo certtool --generate-privkey --outfile client-privkey.pem
Vytvořte soubor šablony klientského certifikátu.
sudo nano client-cert.cfg
Přidejte do souboru následující řádky. Uid musí být uživatelské jméno v /etc/ocserv/ocpasswd
soubor.
# X.509 Certificate options# Organizace předmětu.organizace ="vpn.example.com"# Běžné jméno vlastníka certifikátu.cn ="John Doe"# ID uživatele vlastníka certifikátu.uid ="username"# Za kolik dní, počítáno ode dneška, vyprší platnost tohoto certifikátu. Použijte -1, pokud neexistuje datum vypršení platnosti.expiration_days =3650# Zda bude tento certifikát použit pro TLS servertls_www_client# Zda bude tento certifikát použit k podpisu datasigning_key# Zda bude tento certifikát použit k šifrování dat (potřebné# v TLS RSA šifrovací soupravy). Všimněte si, že je upřednostňováno používat různé # klíče pro šifrování a podepisování.encryption_key
Uložte a zavřete soubor. Poté spusťte následující příkaz pro vygenerování klientského certifikátu, který bude podepsán soukromým klíčem CA.
sudo certtool --generate-certificate --load-privkey client-privkey.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --template client-cert .cfg --outfile client-cert.pem
Zkombinujte klientský soukromý klíč a certifikát v souboru PKCS #12, který je chráněn kódem PIN.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder
Nyní máme klientský soukromý klíč a certifikát sloučeny do jednoho souboru client.p12
.
Všimněte si, že aplikace Ciso AnyConnect na iOS nepodporuje šifru AES-256. Odmítne importovat klientský certifikát. Pokud uživatel používá zařízení iOS, můžete zvolit 3des-pkcs12
šifra.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outderSoukromý klíč klienta a certifikát sloučeny do jednoho souboru
ios-client.p12
.Žádost o podpis certifikátu
Tento krok je potřeba pouze v případě, že existuje více uživatelů VPN a uživatel chce použít svůj vlastní soukromý klíč.
Aby byly soukromé klíče koncových uživatelů uchovány v tajnosti, mohou uživatelé generovat žádost o podepsání certifikátu (CSR) se svými vlastními soukromými klíči a poté odesílat žádosti o certifikát správci, který pak vydává klientské certifikáty uživatelům. Nejprve musí pomocí výše uvedených příkazů vygenerovat soukromý klíč a šablonu klientského certifikátu. Poté vygenerujte CSR pomocí následujícího příkazu.
request.pem
soubor je podepsán soukromým klíčem uživatele.certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pemDále uživatel odešle
request.pem
aclient-cert.cfg
soubor adminovi, který spustí následující příkaz pro vygenerování klientského certifikátu.sudo certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --load-request request.pem --template client-cert.cfg --outfile client-cert.pemPoté administrátor odešle
client-cert.pem
soubor certifikátu uživateli.Povolení ověření certifikátu v démonu ocserv
Upravte konfigurační soubor ocserv.
sudo nano /etc/ocserv/ocserv.confV předchozím tutoriálu jsme přidali následující řádek pro povolení ověřování hesla.
auth ="plain[passwd=/etc/ocserv/ocpasswd]"Chcete-li povolit ověřování certifikátem, zrušte komentář na následujícím řádku.
auth ="certifikát"Pokud jsou oba výše uvedené řádky bez komentáře, znamená to, že uživatel musí projít autentizací heslem i autentizací certifikátem. Pokud tedy k prokázání identity stačí autentizace certifikátem, zakomentujte první řádek.
Pokud uživatelům umožníte, aby si vybrali buď ověření certifikátem, nebo ověření heslem, měli byste mít místo toho následující řádky.
enable-auth ="plain[passwd=/etc/ocserv/ocpasswd]"auth ="certifikát"Nyní najděte parametr ca-cert. V Debianu/Ubuntu je nastavena na
ca-cert =/etc/ssl/certs/ssl-cert-snakeoil.pemNa CentOS 8/RHEL 8 je nastavena na
ca-cert =/etc/ocserv/ca.pemK ověření klientského certifikátu potřebujeme použít vlastní certifikát CA, proto změňte tento řádek na
ca-cert =/etc/ocserv/ssl/ca-cert.pemDále najděte následující řádek.
cert-user-oid =0.9.2342.19200300.100.1.1nemusíte to měnit. Chci vám jen říct, že
0.9.2342.19200300.100.1.1
představuje UID uložené v klientském certifikátu. Výše uvedený řádek říkáocserv
démona k nalezení uživatelského jména z pole UID klientského certifikátu. Pokud je klientský certifikát úspěšně ověřen certifikátem CA aocserv
démon může najít odpovídající uživatelské jméno v/etc/ocserv/ocpasswd
soubor, pak se klient může přihlásit.Uložte a zavřete soubor. Poté restartujte ocserv.
sudo systemctl restart ocservPoužití ověřování certifikátem na ploše Debian/Ubuntu/CentOS/RHEL
Použijte
scp
příkaz ke staženíclient.p12
soubor na plochu Debian/Ubuntu/CentOS/RHEL.scp [e-mail chráněný]:/etc/ocserv/ssl/client.p12 ~Poté nainstalujte
openconnect
klientský software.Debian/Ubuntu:
sudo apt install openconnectCentOS/RHEL:
instalace sudo dnf epel-releasesudo dnf instalace openconnectChcete-li použít ověřování certifikátem, spusťte
sudo openconnect -b vpn.example.com -c klient.p12Budete požádáni o odemknutí soukromého klíče klienta pomocí přístupové fráze, kterou jste dříve nastavili v tomto tutoriálu.
Pokud je heslo zadáno správně, měli byste být nyní připojeni k serveru VPN.
Použití ověřování certifikátem na ploše Windows a MacOS
Stáhněte si OpenConnect GUI klienta pro Windows nebo MacOS ze stránky OpenConnect GUI Github. Poté vytvořte nový profil připojení VPN a importujte soubor PKCS #12 do pole uživatelského certifikátu. Klikněte na tlačítko Uložit. K odemknutí soukromého klíče budete muset zadat PIN. Po importu již nemusíte zadávat uživatelské jméno a heslo.
Použití ověření certifikátem na zařízení iOS
Uživatelé iOS mohou používat aplikaci Cisco AnyConnect. Chcete-li importovat klientský certifikát v aplikaci AnyConnect, můžete nejprve odeslat soubor PKCS #12 na svou e-mailovou adresu v příloze. Poté otevřete poštovní aplikaci na iOS. Klepněte na přílohu několik sekund a sdílejte ji s AnyConnect. Poté zadejte PIN pro import souboru.
Po importu upravte připojení VPN v AnyConnect. Přejděte na
Advanced
->Certificate
a vyberte klientský certifikát. Uložte nastavení.
Nyní již na svém iOS zařízení nemusíte zadávat uživatelské jméno a heslo. Aplikace Cisco AnyConnect si nepamatuje uživatelské jméno a heslo, takže v režimu ověřování heslem se připojení VPN přeruší, když se telefon nepoužívá. V režimu ověřování certifikátem se aplikace automaticky znovu připojí k serveru VPN, pokud je připojení přerušeno.
Problémy s klientem AnyConnect v systému iOS
Nejnovější verze klienta AnyConnect na iOS má problém při použití ověřování certifikátem v protokolu TLS 1.3. Pokud v protokolu ocserv uvidíte následující chybu (
sudo journalctl -eu ocserv
), máte stejný problém.Chyba GnuTLS (na adrese worker-vpn.c:795):Bylo přijato závažné upozornění TLS.Buď musíte použít ověřování heslem v klientovi AnyConnect iOS nebo zakázat TLS 1.3 v konfiguračním souboru ocserv. Chcete-li zakázat TLS1.3, vyhledejte
tls-priorities
parametr v/etc/ocserv/ocserv.conf
a přidejte:-VERS-TLS1.3
na konci zakázat TLS 1.3.tls-priorities ="NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS -TLS1.3 "."Uložte a zavřete soubor. Poté restartujte ocserv.
sudo systemctl restart ocservPoznámka :Pokud vidíte
SSL 3.3
fráze v protokolech ocserv, nepropadejte panice. SSL 3.3 je jiné slovo pro TLS 1.2. Používáte zabezpečené připojení TLS.
Nainstalujte phpMyAdmin s Apache (LAMP) na Debian 10 Buster Jak povolit protokol HTTP2 s Nginx na serveru Debian 8 JessieDebian