W wersji 7.x fortigate z części urządzeń („z dolnej półki”) usunął możliwość konfigurai połączenia VPN w oparciu o SSL.
Połączenie VPN bazujące na logowaniu kontem użytkownika wraz z hasłem oraz dodatkowo z certyfikatem można zrealizować w oparciu o IPSec.
W pierwszej kolejności należy wygenerować certyfikaty. Fortigate nie oferuje natywnego wsparcia generowania certyfikatów więc musimy wykorzystać np. oprogramowanie openssl do wygenerowania kompletu certyfikatów. Potrzebne będą trzy certyfikaty:
– certyfikat CA
– certyfikat serwera (dla Fortigate)
– certyfikat użytkownika (klienta VPN).
W przypadku systemu Windows możemy pobrać pakiet FireDaemon OpenSSL
Po instalacji generujemy poszczególne certyfikaty. Poniżej jest skrypt powershell, który wygeneruje odpowiednie certyfikaty
# =====================================================================
# SKRYPT GENERUJĄCY CERTYFIKATY VPN (FortiGate IKEv2)
# =====================================================================
$ErrorActionPreference = "Stop"
# --- 1. PARAMETRY KONFIGURACYJNE (Dostosuj do swojego środowiska) ---
$OrgName = "NazwaFirmy"
$Country = "PL"
$State = "Podkarpackie"
$City = "Rzeszow"
$VpnFqdn = "fg.naszadomena.pl" # Nazwa domenowa bramy VPN (FortiGate)
$VpnIp = "x.x.x.x" # Publiczny adres IP bramy VPN (FortiGate)
$ClientName = "uzytkownikvpn" # Nazwa pierwszego certyfikatu klienta
$Password = "NaszeHasloDoKluczaPrywatnego" # Hasło do klucza CA oraz paczek .p12
# --- 2. UTWORZENIE LOKALNEGO PLIKU OPENSSL.CNF (Obejście błędu Apache24) ---
$OpensslConfPath = "$PWD\openssl.cnf"
@"
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[ req_distinguished_name ]
C = $Country
ST = $State
L = $City
O = $OrgName
CN = $OrgName-Root-CA
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
"@ | Set-Content -Path $OpensslConfPath -Encoding Ascii
# Ustawienie zmiennej środowiskowej dla bieżącej sesji PowerShell
$env:OPENSSL_CONF = $OpensslConfPath
Write-Host "`n[1/4] Generowanie Urzedu Certyfikacji (Root CA)..." -ForegroundColor Cyan
openssl genrsa -aes256 -passout "pass:$Password" -out ca.key 4096
#generowanie certyfikatu CA ważnego 10 lat.
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl req -config $OpensslConfPath -x509 -new -key ca.key -passin "pass:$Password" -sha256 -days 3650 -out ca.crt -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$OrgName-Root-CA"
Write-Host "`n[2/4] Generowanie certyfikatu serwera dla FortiGate ($VpnFqdn / $VpnIp)..." -ForegroundColor Cyan
openssl genrsa -out server.key 2048
openssl req -config $OpensslConfPath -new -key server.key -out server.csr -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$VpnFqdn"
@"
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, 1.3.6.1.5.5.8.2.2
subjectAltName = DNS:$VpnFqdn, IP:$VpnIp
"@ | Set-Content -Path "$PWD\server_ext.cnf" -Encoding Ascii
#generowanie certyfikatu serwera ważnego 825 dni.
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -passin "pass:$Password" -CAcreateserial -out server.crt -days 825 -sha256 -extfile "$PWD\server_ext.cnf"
Write-Host "`n[3/4] Generowanie certyfikatu klienta ($ClientName)..." -ForegroundColor Cyan
openssl genrsa -out "$ClientName.key" 2048
openssl req -config $OpensslConfPath -new -key "$ClientName.key" -out "$ClientName.csr" -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$ClientName"
@"
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
"@ | Set-Content -Path "$PWD\client_ext.cnf" -Encoding Ascii
#generowanie certyfikatu klienta ważnego 2 lata.
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl x509 -req -in "$ClientName.csr" -CA ca.crt -CAkey ca.key -passin "pass:$Password" -CAcreateserial -out "$ClientName.crt" -days 730 -sha256 -extfile "$PWD\client_ext.cnf"
Write-Host "`n[4/4] Eksportowanie gotowych paczek PKCS#12 (.p12)..." -ForegroundColor Cyan
openssl pkcs12 -export -out "fortigate_server.p12" -inkey server.key -in server.crt -certfile ca.crt -passout "pass:$Password"
openssl pkcs12 -export -out "$ClientName.p12" -inkey "$ClientName.key" -in "$ClientName.crt" -certfile ca.crt -passout "pass:$Password"
# Czyszczenie tymczasowych plików CSR i CNF
Remove-Item "server.csr", "$ClientName.csr", "server_ext.cnf", "client_ext.cnf" -ErrorAction SilentlyContinue
Write-Host "`n=====================================================================" -ForegroundColor Green
Write-Host " GOTOWE! Wygenerowano komplet certyfikatow w katalogu: $PWD" -ForegroundColor Green
Write-Host " -> ca.crt (Zaimportuj na FortiGate jako CA oraz w Windows klienta)"
Write-Host " -> fortigate_server.p12 (Zaimportuj na FortiGate jako Local PKCS#12 Certificate)"
Write-Host " -> $ClientName.p12 (Zainstaluj u uzytkownika dla FortiClient)"
Write-Host "=====================================================================" -ForegroundColor Green
Po wykonaniu powyższego skryptu otrzymamy 3 certyfikaty wraz z odpowiednimi kluczami prywatnymi. Wszystkie certyfikaty odpowiednio zabezpieczamy.
Wygenerowany plik i przeznaczenie
ca.crt – certyfikat Twojego Root CA. Wgraj go na FortiGate (System > Certificates > Import > CA Certificate) oraz zainstaluj na komputerach użytkowników w magazynie Zaufane główne urzędy certyfikacji.
fortigate_server.p12 – certyfikat serwera VPN wraz z kluczem prywatnym. Wgraj go na FortiGate (System > Certificates > Import > Local Certificate > PKCS #12), podając hasło zdefiniowane w zmiennej $Password.
uzytkownikvpn.p12 – gotowa certyfikat wraz kluczem prywatnym do instalacji na urządzeniu klienckim. Po dwukrotnym kliknięciu w Windows i wpisaniu hasła $Password, certyfikat pojawi się na liście wyboru w FortiClient.
ca.key – najważniejszy klucz prywatny Twojego CA. Zachowaj go wraz z plikiem ca.crt, aby w przyszłości móc wystawiać certyfikaty dla kolejnych użytkowników bez konieczności rekonfiguracji FortiGate!
W kolejnym kroku logujemy się do Fortigate i przechodzimy do menu System > Certificates > Import > CA Certificate

i importujemy nasz certyfikat CA

Po imporcie należy zwrócić uwagę pod jaką nazwą zapisał się nasz certyfikat CA. Będzie on dostępny w sekcji „Remote CA Certificate”. W poniższym przykładzie ma on nazwę CA_Cert_1. Nazwa będzie potrzebna w dalszej części konfiguracji Fortigate

W kolejnym kroku importujemy certyfikat serwera


Podajemy plik certyfikatu serwera w formacie p12 i wprowadzamy hasło

Po imporcie certyfikat będzie dostępny w sekcji „Local Certificate”. Nazwę należy zapamiętać gdyż będzie potrzebna w kolejnych etapach konfiguracji.
Uruchamiamy konsolę i wydajemy kolejno polecenia:
Konfiguracja klienta – PKI peer
CA – nazwa certyfikatu CA zaimportowanego do FG
po CN podajemy nazwę jaką umieśliliśmy w skrypcie ps w zmiennej $ClientName
config user peer
edit "VPN-CLIENT-PEER"
set ca "CA_Cert_1"
set subject "CN=uzytkownikvpn"
next
end
Powyższy obiekt ma ograniczyć akceptację certyfikatów do wskazanej tożsamości.
Utworzenie użytkownika VPN
config user local
edit "nazwa_uzytkownika_vpn"
set type password
set passwd "SilneHasloUzytkownika456!"
next
end
w polecenie „set passwd” wprowadzamy hasło dla naszego użytkownika VPN
Utworzenie grupy użytkowników którzy mogą zestawiać połączenie VPN
config user group
edit "VPN-USERS"
set member "nazwa_uzytkownika_vpn"
next
end
W linii „set member” podajemy nazwę wcześniej utworzonego użytkownika
Konfiguracje IPSec Phase 1
To jest najważniejsza część. Zwróć uwagę na kolejność: najpierw set peertype peer, następnie set peer.
config vpn ipsec phase1-interface
edit "VPN-IKEv2"
set type dynamic
set interface "vlan300"
set ike-version 2
set authmethod signature
set peertype peer
set peer "VPN-CLIENT-PEER"
set cert-peer-username-validation none
set certificate "nazwa_certyfikat_serwera_fg"
set proposal aes256-sha256
set dhgrp 14
set net-device disable
set mode-cfg enable
set eap enable
set eap-identity send-request
set eap-cert-auth enable
set authusrgrp "VPN-USERS"
set assign-ip enable
set assign-ip-from range
set ipv4-start-ip 10.10.10.100
set ipv4-end-ip 10.10.10.150
set ipv4-netmask 255.255.255.0
set dns-mode manual
set ipv4-split-include "Lan5"
set dpd on-idle
set dpd-retryinterval 60
set nattraversal enable
set transport auto
next
end
Parametry do ewentualnej modyfikacji pod swoje FG:
set interface „wan” – podajemy nazwę interfejsu publicznego WAN
set peer „VPN-CLIENT-PEER” – nazwa utworzonej wcześniej PKI peer
set certificate „nazwa_certyfikat_serwera_fg” – podajemy nazwę naszego certyfikatu serwera FG
set proposal aes256-sha256 – ustawienie szyfrowania w zależności od potrzeb
set dhgrp 20 – ustawienie grupy DH
set authusrgrp „VPN-USERS” – nazwa grupy użytkowników VPN
set ipv4-start-ip 10.10.10.100 – zakres początkowy adresów IP dla klientów VPN
set ipv4-end-ip 10.10.10.150 – zakres końcowy dresów IP dla klientów VPN
set ipv4-netmask 255.255.255.0 – maska podsieci dla klientów
set ipv4-split-include „Lan5” – podajemy podsieć która będzie przepuszczana przez VPN (podsieć docelowa), pozostały ruch od klienta będzie wychodził jego domyślną bramą
Konfiguracja Phase 2
#Konfiguracja Phase 2
config vpn ipsec phase2-interface
edit "VPN-IKEv2-P2"
set phase1name "VPN-IKEv2"
set proposal aes256-sha256
set pfs enable
set dhgrp 20
set src-addr-type subnet
set src-subnet 0.0.0.0/0
set dst-addr-type subnet
set dst-subnet 0.0.0.0/0
next
end
Definiujemy obiekt puli adresów IP dla VPN (zgodnie z podanym zakresem w Phase 1)
config firewall address
edit "VPN-CLIENTS"
set type iprange
set start-ip 10.10.10.100
set end-ip 10.10.10.150
next
end
Definicja reguły firewall
#firewall
config firewall policy
edit 10
set name "VPN-to-LAN"
set srcintf "VPN-IKEv2"
set dstintf "lan"
set srcaddr "VPN-CLIENTS"
set dstaddr "Lan5"
set action accept
set schedule "always"
set service "ALL"
set nat disable
next
end
Po wykonani powyższych czynności przechodzimy do konfiguracji klienta.
Na komputerze klienta importujemy certyfikat CA do sekcji „Zaufane główne urzędy certyfikacji”

Certyfikat klienta importujemy do magazynu użytkownika
Uruchamiamy klienta VPN Fortigate i konfigurujemy nowe połączenie
typ VPN – IPSec VPN
Connection Name – nazwa naszego połączenia
Remote Gateway – IP publiczne lub nazwa domenowa naszego FG
Authentication Method – zmieniamy na X.509 Certificate i poniżesz wybieramy z magazynu nasz certyfikat klienta
Authentication (EAP) – „prompt for login” lub „Save login” aby podać nazwę użytkownika i hasło
W sekcji advanced Setting
IKE – version 2
Phase 1, encryption oraz DH group – zgodnie z ustawieniem w konfiguracji FG
Phase 2, encryption oraz DH group – zgodnie z ustawieniem w konfiguracji FG


Zapisujemy zmiany i próbujemy zestawić połączenie.
W przypadku braku zestawienia połączenia możemy po stronie FG włączyć debugowanie połączenia VPN
diagnose vpn ike log filter clear
diagnose vpn ike log filter rem-addr4 x.x.x.x
diagnose debug console timestamp enable
diagnose debug application ike -1
diagnose debug enable
Zamiast x.x.x.x wstawiamy IP publiczne naszego klienta
Zatrzymanie debugowania
diagnose debug disable
diagnose debug reset
W przypadku gdy po zestawieniu połączenia nie działa Internet i nie ma połączenia do sieci lokalne (poprzez VPN)- „route print -4” pokazuje inne trasy niż skonfigurowane należy sprawdzić czy na kliencie nie ma podwójnych kart sieciowych z fortinet np. z poprzedniej wersji. W przypadku gdy są podwójne pozostawić tylko nowe karty a stare usunąć.