Door MarcoNL: Iemand anders stelde ook al deze vraag in de replies op het artikel:
"Als de VPN client elk certificaat accepteert, hoe zou het vervangen van het server-side certificaat dan MITM-aanvallen kunnen helpen voorkomen?"
Dat was ik :-)
Om te beginnen zitten er wat tegenstrijdigheden in het artikel van SecuringSam (
https://securingsam.com/breaching-the-fort/), daarin staat:
The Fortigate SSL-VPN client only verifies that the CA was issued by Fortigate (or another trusted CA),
[...]
The Fortigate router comes with a default SSL certificate that is signed by Fortinet (Self-signed, that is, it was not issued by a trusted CA)
In het plaatje onder "Fortigate Example Certificate" zijn verschillen te zien tussen de velden onder "Subject Name" en "Issuer Name" die erop
zouden kunnen duiden dat het
niet om een self-signed certificaat gaat. Als Fortinet zelf CA speelt en hun root-certificaat (of -certificaten) meegeeft met de VPN-client-software,
zou er sprake kunnen zijn van een solide basis.
Echter:
This leaves Fortinet with enough information to verify the certificate was issued to the same server the client is trying to connect to, if it were to verify the serial number. However, Fortinet’s client does not verify the Server Name at all.
Met "Server Name" wordt hier, neem ik aan, het serienummer bedoeld (waarvan je mag hopen dat het wereldwijd uniek is).
Interessant is dat in het plaatje onder "Fortinet’s vague warning" het volgende staat:
You are using a default built-in certificate, which will not be able to verify your server's domainname (your users will see a warning).
Het filmpje vind ik te vaag om eruit op te maken dat gebruikers daadwerkelijk een waarschuwing te zien krijgen bij een Fortinet certificaat (al dan niet self-signed). Ook weet ik niet of gebruikers (van de VPN-client), indien gebruik gemaakt wordt van een publiek uitgegeven certificaat (met CN = domeinnaam) te zien krijgen met welke domeinnaam er verbinding wordt gemaakt.
Denkbaar is wel dat de VPN-client-software de domainnaam in een publiek uitgegeven certificaat, zoals het hoort, vergelijkt met de domeinnaam waar verbinding mee wordt gemaakt (dit vereist dat in de VPN-client geen IP-adres maar een domeinnaam is geconfigureerd, zoals
vpn.example.com). Echter volgens SecuringSam:
The Fortigate SSL-VPN client only verifies that the CA was issued by Fortigate (or another trusted CA),
Als de VPN-client niet checkt of de domeinnaam in het publieke certificaat overeenkomt met de domainnaam waar de verbinding mee gemaakt is (en SecuringSam geen instelling over het hoofd heeft gezien), heeft het geen zin om het Fortinet certificaat door een publiek certificaat te vervangen.
Er is echter helemaal niks mis met een self-signed server-certificaat
als je precies weet wie de legitieme clients zijn die deze server bezoeken. Gebruikelijk is om dan van
certificate-pinning of
public-key-pinning gebruik te maken (een lange levensduur van het certificaat is, bij certificate-pinning, dan wel zo handig). Dit onder de voorwaarde dat de client niet, als alternatief, ook elk willekeurig publiek certificaat accepteert.
Conclusie: ik zou eerst onderzoeken of de client zó geconfigureerd kan worden dat pinning wordt gebruikt en alternatieve publieke certificaten (en natuurlijk certificaten van andere FortiGates) worden geweigerd. Als dat niet volledig wordt ondersteund, zou ik een publiek certificaat installeren en verifiëren dat de client de verbinding weigert als de domeinnaam waarmee verbinding wordt gemaakt niet overeenkomt met de domeinnaam in het certificaat. Als ook dat fout gaat zou ik mijn geld terugvragen.
Om dat laatste te testen zou je (mits de VPN-client de hosts file raadpleegt) het volgende kunnen doen als
vpn.example.com de correcte domeinnaam is en 10.1.2.3 het echte IP-adres is:
1) Configureer de VPN-client om verbinding te maken met
flauwe.kul.example.com (i.p.v.
vpn.example.com)
2) Neem op in hosts file:
10.1.2.3 flauwe.kul.example.comHet opzetten van een VPN-verbinding zou dan een foutmelding moeten opleveren.