Pozn.: Popis v článku vychází z FortiGate FG-300E s FortiOS verzí 6.2.3. Který je nakonfigurovaný jako FGCP cluster a využívá VDOM.
SSL VPN vyžadování klientského certifikátu
Standardně se uživatelé ověřují zadáním jména a hesla. Mohou být definováni lokálně nebo vzdáleně. Speciální případ jsou lokální Peer (PKI) users, kteří se ověřují klientským digitálním certifikátem. Mohou se autentizovat pouze certifikátem nebo dvoufaktorově včetně zadání hesla. V případě SSL VPN můžeme vyžadovat ověření certifikátu pro všechny uživatele (jedno, kde jsou definováni).
- (VDOM) > SSL > SSL-VPN Settings
Při přihlašování do SSL VPN můžeme v GUI zapnout vyžadování klientského certifikátu (Require Client Certificate). Pokud pouze zapneme tuto volbu, tak se akceptují všechny certifikáty, které jsou pro FortiGate důvěryhodné. Přesné chování můžeme ovlivnit globálním nastavením VPN certifikátů (viz. dále). Použitím CLI můžeme přiřadit PKI uživatele (Peer User) a v tomto objektu definovat detaily certifikátu, který se akceptuje.

Zapnout ověření klientského certifikátu můžeme v globálním nastavení SSL VPN (SSL-VPN Settings). Pak všechna připojení (portály) budou vyžadovat certifikát klienta. Nebo můžeme nastavit pomocí CLI v autentizačním pravidle, kde mapujeme uživatele na portál. Pak se projeví pouze pro připojení na daný portál a daného uživatele.
Pokud nastavíme vyžadování certifikátu v globálním nastavení, tak ověření probíhá hned v úvodní fázi, kdy se navazuje TLS spojení. V případě, že neprojde certifikát, tak se ani neověřuje uživatel. Při nastavení v autentizačním pravidle se musí nejprve zjistit uživatel, abychom věděli, zda je certifikát vyžadován.
Když přistupujeme na Web VPN, tak vyskočí požadavek na certifikát při přístupu na stránku. Certifikát se posílá dříve, než se zobrazí přihlašovací dialog. Pokud jsme nastavili v určitém autentizačním pravidle, tak stejně vyskakuje požadavek všem (kteří se připojují přes stejné URL). Pokud pro naše připojení certifikát vyžadován není, tak dialog můžeme zrušit a pokračovat. Pokud chceme zařídit, aby se požadavek zobrazil pouze tam, kde je certifikát vyžadován, tak můžeme vytvořit různé Realm. Definujeme různá URL (Virtual Host) a každý přiřadíme k jiné skupině pravidel.
Při zapnutém ověřování certifikátu se kontrolují různé vlastnosti certifikátu. Například zda to není Self-signed certifikát, zda je od důvěryhodné autority, může se kontrolovat CRL apod. Některé věci můžeme ovlivnit v nastavení certifikátů (config vpn certificate setting
). Pokud máme navíc použité Peer User, tak se hledá, zda certifikát vyhovuje některému z nich.
Pokud při přihlášení nemáme nastavený certifikát, tak se zobrazí chyba.

Počítačový certifikát (Computer Certificate)
Běžně Fortinet využívá uživatelský certifikát (User Certificate - certmgr.msc
), ale je možno použít i počítačový certifikát (Computer Certificate - certlm.msc
) na OS Windows. Pokud má uživatel práva přístupu do počítačového úložiště certifikátů, tak se mu patřičné certifikáty nabízejí při výběru certifikátu ve FortiClient. Patrně jde o certifikáty s Enhanced Key Usage = Client Authentication. Ale když takový certifikát použijeme, tak se do VPN nepřipojíme. Při použití debug se dá zjistit (i když FortiGate je velmi chudý v zobrazení informací), že se certifikát vůbec nepošle na server. Opravdu vtipné chování.
Na fóru jsem našel dotazy lidí, jak použít autentizaci počítačovým certifikátem. A odpovědi, že to nelze. Ale nakonec, skoro náhodou, se mi povedlo nalézt jeden Fortinet článek Technical Tip: How to use machine certificates for SSLVPN connections in FortiClient. A podle něj se opravdu použití počítačového certifikátu jednoduše zprovozní.
FortiClient povolení počítačových certifikátů
Je potřeba změnit nastavení aplikace FortiClient.
- vytvoříme zálohu nastavení
- FortiClient - Settings - v části System - Backup
- třeba do souboru
forticlient.conf
, potvrdíme OK, dostaneme informaci, že záloha proběhla
- upravíme konfiguraci
- konfiguraci otevřeme v textovém editoru a najdeme častí, kde jsou definována naše připojení do VPN
<connections> <connection> <name>Moje VPN připojení</name>
Pozn.: upravit musíme všechna připojení, kde chceme použít počítačový certifikát
- třeba za část, kde jsou definovány certifikáty, doplníme nový řádek s elementem
allow_standard_user_use_system_cert
</certificate> <allow_standard_user_use_system_cert>1</allow_standard_user_use_system_cert> <warn_invalid_server_certificate>1</warn_invalid_server_certificate>
- soubor uložíme
- obnovíme konfiguraci do FortiClient
- odemkneme nastavení - vlevo dole (nebo vpravo nahoře) zámek Unlock Settings
- Settings - Restore - vybereme soubor a potvrdíme
Peer User (PKI uživatel)
PKI uživatele můžeme použít řadou způsobů. Můžeme pomocí něj vytvořit lokálního uživatele s definicí certifikátu (která určuje přímo jeden certifikát) i hesla, kterého zařadíme do skupiny a tu použijeme do VPN. SSL VPN with certificate authentication
Nebo tento objekt můžeme použít k definici všech certifikátů, které se akceptují pro ověření do SSL VPN. A následně ověříme uživatele na vzdáleném serveru (LDAP). Technical Tip: RADIUS authentication and client certificates in SSL VPN. Pak tohoto uživatele přiřadíme v konfiguraci SSL VPN nastavení příkazem set user-peer {string}
Pokud ověřujeme uživatele na LDAP serveru, tak můžeme nastavit přihlášení pouze certifikátem, bez zadávání jména a hesla. Ze Subject certifikátu se vezme User Principal Name a podle něj se hledá uživatel. SSL VPN with LDAP-integrated certificate authentication
Vytvoření Peer (PKI) User
Dokumentace user peer, Technical Tip: PKI peer user creation for certificate authentication
PKI uživatele musíme vytvořit pomocí CLI a minimálně musíme určit CA z které je certifikát vydán.
config user peer edit "certuser" set ca "Moje_Root_Authority" next end
- (VDOM) > User & Device > PKI
Ale jakmile vytvoříme prvního uživatele v CLI, tak se v GUI zobrazí možnost editace a přidání dalších. Ovšem CLI nabízí více množností nastavení.
Parametry Peer (PKI) User
PKI uživateli můžeme nastavit pouze určitou certifikační autoritu a pak budou akceptovány všechny certifikáty od ní. V praxi jsem měl problém (který jsem dále nezkoumal). Pokud máme dvoustupňovou hierarchii CA, tedy kořenovou autoritu (Root CA) a podřízenou (Intermediate CA), která vydává certifikáty. Když jsem do PKI uživatele nastavil Intermediate CA (která se zobrazuje na klientovi při výběru certifikátu), tak ověření neprošlo. Když jsem změnil na Root CA, tak začalo fungovat.
Pro další upřesnění můžeme určit, co se má nacházet v položce Subject certifikátu. Případně přímo v atributu CN (Common Name) položky Subject. Ve výchozím nastavení se hledá podřetězec (substring
), tedy pokud se zadaný řetězec nachází uvnitř položky Subject nebo CN, tak se bere jako odpovídající.
Můžeme použít třeba název domény a akceptovat se budou všechny uživatelské certifikáty, kde je emailová adresa s danou doménou. Nebo počítačové certifikáty, kde je DNS jméno počítače s touto doménou. Pro upřesnění můžeme začít znakem zavináč, respektive tečka. Případně můžeme zadávat detailněji definované atributy v položce Subject.
Různé příklady filtru:
set subject ".firma.local" set subject "@firma.cz" set subject "OU = firma.cz" set subject "CN = Bouška Petr" set subject "bouska@firma.cz" set subject "bouska-win10.firma.local" set subject "CN = bouska-win10.firma.local" set cn ".firma.local"
Pro atribut CN můžeme ještě určit jeho typ string, email, FQDN, ipv4, ipv6.
set cn-type string
Nastavení VPN certifikátů
Dokumentace vpn certificate setting
Různé způsoby chování, při ověřování certifikátů, můžeme nastavit globálně v nastavení VPN certifikátů. Níže jsou příklady nastavení zajímavých položek včetně výchozích hodnot. Nastavuje se kontrola CA, případně celého řetězce. Jestli se v Subject nebo CN hledá podřetězec (substring
) nebo přesná hodnota (value
) atributu. Možnost zapnout Strict CRL/OCSP kontrolu.
config vpn certificate setting set check-ca-cert enable set check-ca-chain disable set subject-match substring set cn-match substring set strict-crl-check disable set strict-ocsp-check disable end
Přiřazení Peer (PKI) User v nastavení VPN
Přiřazení vytvořeného PKI uživatele, a tedy definici povolených certifikátů, spolu se zapnutím vyžadování klientského certifikátu, můžeme nastavit pro všechna připojení v globálním nastavení SSL VPN. Nebo v některém autentizačním pravidle (Authentication/Portal Mapping), kde mapujeme uživatele na portál (případně s určitým Realm) a ovlivní tuto kombinaci připojení. V obou případech musíme nastavit pomocí CLI.
Konfigurace Peer User v globálním nastavení SSL VPN
config vpn ssl settings set reqclientcert enable set user-peer {string} end
V globálním nastavení ještě můžeme zapnout vyžadování PKI uživatele s dvoufaktorovou autentizací.
config vpn ssl settings set force-two-factor-auth enable end
Konfigurace Peer User v autentizačním pravidle
config vpn ssl settings config authentication-rule edit 1 set client-cert enable set user-peer {string} next end
Události při debugování
Pokud zapneme v CLI debug SSL VPN, tak se logují různé události ohledně kontroly certifikátu (ale mohlo by jich být více). Následují příklady různých událostí a vybraných logů.
diagnose debug application sslvpn -1 diagnose debug enable
Je vyžadován certifikát, ale klient žádný nepoužije.
[9315:FWINT:7a2]client cert requirement: yes [9313:FWINT:7ad]No client certificate [9313:FWINT:7ad]Require client certificate for bouska [9313:FWINT:7ad]login_failed:384 user[bouska],auth_type=16 failed [sslvpn_login_cert_checked_error]
Použití Self-signed certifikátu.
[9314:FWINT:74a]client cert requirement: yes [9314:FWINT:74a]SSL state:SSLv3/TLS write certificate request (78.248.255.155) [9314:FWINT:74a]SSL certificate verification: self signed certificate [9314:FWINT:74a]SSL error: self signed certificate [9314:FWINT:74a]SSL state:SSLv3/TLS read client certificate (78.248.255.155) [9314:FWINT:74a]doing certificate checking.
Úspěšné použití korektního certifikátu.
[9314:FWINT:74b]client cert requirement: yes [9314:FWINT:74b]SSL state:SSLv3/TLS write certificate request (78.248.255.155) [9314:FWINT:74b]SSL state:SSLv3/TLS read client certificate (78.248.255.155) [9314:FWINT:74b]doing certificate checking. [9314:FWINT:74b]__auth_cert_cb:903 certificate check OK.
Úspěšné přihlášení s Peer User se jménem certuser.
[9313:FWINT:778]client cert requirement: yes [9313:FWINT:778]fam_cert_send_req:808 do certificate peer check first(2). [9313:FWINT:778]doing certificate checking for 1 peer(s). [9313:FWINT:778]__auth_cert_cb:903 certificate check OK. [9313:FWINT:778]__auth_cert_cb:915 certificate check OK, matched peer [certuser]. [9313:FWINT:778]sslvpn_update_user_group_list:1533 Remove user(s) and group(s) do not set matched peer [certuser]. [9313:FWINT:778]sslvpn_update_user_group_list:1537 got user (0:0), group (1:1) peer group (0) after update. [9313:FWINT:778]sslvpn_authenticate_user:191 authenticate user: [bouska] [9313:FWINT:778]Auth successful for group G VPN1 [9313:FWINT:778]Auth successful for group [G VPN1] with matched user-peer [certuser] [9313:FWINT:778]fam_do_cb:654 fnbamd return auth success.
Neúspěšné přihlášení s Peer User.
[9315:FWINT:76e]doing certificate checking for 1 peer(s). [9315:FWINT:76e]sslvpn_update_user_group_list:1563 Remove group(s) which has set user-peer (1). [9315:FWINT:76e]sslvpn_update_user_group_list:1595 got user (0:0), group (0:0), peer group (0) after update. [9315:FWINT:76e]__auth_cert_cb:939 no valid user/group candidate found.
Komentáře
Zatím tento záznam nikdo nekomentoval.