MISE EN PLACE D'UN SERVEUR OPENVPN AVEC PKI
Mise en place du serveur AD CS :
Installation du rôle et de l'autorité racine du domaine :
  • Ajout du rôle Service de certificat Active Directory :
    • Aller dans Gérer > Ajouter des rôles et fonctionnalités puis cliquer sur Suivant
    • Installation basée sur un rôle ou une fonctionnalité puis Suivant et Suivant
    • Cocher Services de Certificats Active Directory puis Suivant jusqu’à Sélectionner des services de rôle :
    • Cocher tous les services :
    • Faire suivant jusqu’à l’installation puis patienter.
  • Configuration post-install :
    • Une fois l’installation terminée, cliquer sur le drapeau de notification et sélectionner Configurer les services de certificats
    • Cliquer sur Suivant puis cocher les options ci-dessous :
    • Sélectionner Autorité de certification d’entreprise puis suivant :
    • Puis cocher Autorité de certification racine puis sur la page suivante Créer une clé privée :
    • Pour le chiffrement nous allons laisser le fournisseur par défaut et laisser l’algorithme de hachage en SHA256 :
    • Modifier si vous le souhaitez, le nom commun de =l’AC
    • Sélectionner la période de validité du certificat. Il va dépendre de son utilité (période d’emploi, criticité des données etc.) puis suivant jusqu’à la page Type d’authentification.
    • Pour le type d’authentification, cocher Authentification intégrée de Windows pour une connexion avec les identifiants du compte utilisateur de l’AD.
    • Dans confirmations cliquer sur Configurer puis Fermer.
    • Lorsque l’on vous demande de configurer les services et rôles additionnelles répondre oui.
    • Cocher les services de rôle manquant :
    • Nous allons maintenant ajouter un compte de service d’inscription.
    • La bonne pratique est de créer un compte admin dédié à la gestion des certificats. Mais pour plus de simplicité pour ce TP, nous allons accorder les droits à un compte admin existant
      • Dans Utilisateurs et Ordinateurs Active directory dans l’OU Users sélectionner un compte admin (ou en créer un). Clique droit > Propriété
      • Dans l’onglet Membre de, Ajouter puis sélectionner le nom du groupe : IIS IUSRS vérifier les noms, sélectionner le puis OK.
    • Revenir sur la configuration des services d’inscription de périphérique réseau et ajouter le compte admin créé / Modifié précédemment. Entrer les identifiants de connexion de ce compte puis valider :
    • Renseigner les informations demandés pour le certificats :
    • Laisser par défaut les fournisseurs de clés proposés et laisser le nom de l’AC.
    • Pour le type d’authentification on choisira Authentification intégrée de Windows
    • Sélectionner le même utilisateur que précédemment (Compte de service d’inscription de périphérique réseau) pour le compte de service Web inscription puis Configurer.
  • Pour vérifier la bonne création du certificat, ouvrir PowerShell en Admin puis taper la commande : Get-ChildItem -Path Cert:\LocalMachine\My
Déploiement du certificat racine dans les objets AD :

Comportement par défaut lors de la création d'une AC racine :

  • Le certificat racine est généré et stocké sur le serveur où l'AC est installée. Il n'est pas automatiquement déployé sur les ordinateurs ou les utilisateurs du domaine.
  • Il est stocké dans le magasin de certificats local du serveur de l'AC (dans certlm.msc > Autorités de certification racines de confiance > Certificats).

Déploiement du certificat racine sur les objets de l'AD :

  • Déploiement via une GPO :
    • Exporter le fichier racine :
      • Sur le serveur de l'AC, ouvrez certlm.msc (Certificats - Ordinateur local).
      • Allez dans Autorités de certification racines de confiance > Certificats.
      • Trouvez le certificat racine de votre AC, faites un clic droit et sélectionnez Toutes les tâches > Exporter.
      • Choisissez le format DER (.cer)
      • Enregistrer le fichier
    • Créer une GPO pour déployer le certificat racine :
      • Ouvrez gpmc.msc (Gestion des stratégies de groupe) depuis PowerShell
      • Créer une nouvelle GPO :
        • Clique droit sur le nom de domaine puis Nouvelle OU que l’on nommera Ordinateur
        • Sur l’OU nouvellement créée, clique droit puis Créer un objet GPO et la nommer Deploy_Root_CA_Cert
        • Faite clic droit sur la GPO puis Modifier, aller dans Configuration ordinateur > Stratégies > Paramètres Windows > Paramètres de sécurité > Stratégies de clé publique et faire un clic droit sur Autorités de certification racines de confiance et sélectionner Importer.
        • Sélectionner le certificat à importer (*.cer)
        • Cliquer sur suivant puis Terminer. La GPO sera liée à l’OU Ordinateurs.
      • Forcer la mise à jour des stratégie de groupe :
        • Sur un poste-client intégrer au domaine. Placée dans l’OU où la GPO a été lié (l’OU Ordinateurs dans notre cas). Forcer la mise à jour en tapant dans une invite de commande : gpupdate /force

Vérification du déploiement :

  • Sur un poste client intégrer au domaine, taper via une invite de commande certmgr.msc et vérifier la présence du certificat
  • Idem avec la commande certlm.msc
Création des modèles de certificats :

Ouverture de la console des modèles via un cmd : certlm.msc

Création d’un modèle pour le serveur :

  • Dans la console ouverte, clic droit sur Ordinateur puis Dupliquer le modèle
  • Onglet Comptabilité :
    • Autorité de certification : Windows Server 2016 (ou votre version)
    • Destinataire du certificat : Windows 10 / Windows Server 2016 (ou votre version)
  • Onglet Général :
    • Nom du modèle : OpenVPN_Server
    • Nom complet : OpenVPN Server Certificate
    • Période de validité : 2 ans
    • ☑️ Publier le certificat dans Active Directory
  • Onglet Nom du sujet :
    • IMPORTANT : Sélectionner Fournir dans la demande
    • Une alerte apparaît : cliquer OK
  • Onglet Traitement de la demande :
    • ☑️ Autoriser l'exportation de la clé privée
  • Onglet Extension :
    • Sélectionner Utilisation de la clé → Modifier
    • Vérifier que ces options sont cochées :
      • ☑️ Signature numérique
      • ☑️ Chiffrement de clé
    • OK
    • Sélectionner Stratégies d'application → Modifier
    • Ajouter → Sélectionner Authentification du serveur → OK
    • Ajouter → Sélectionner Authentification du client → OK
    • OK
  • Onglet Sécurité :
    • Vérifier que Administrateurs du domaine a :
      • ☑️ Lecture
      • ☑️ Écriture
      • ☑️ Inscription
      • ☑️ Inscription automatique
    • Ajouter Ordinateurs du domaine :
      • ☑️ Lecture
      • ☑️ Inscription
    • Ajouter Administrateur (le compte que vous utilisez) :
      • ☑️ Contrôle total

Création d’un modèle pour le poste client :

  • Dans la console ouverte, clic droit sur Ordinateur puis Dupliquer le modèle
  • Onglet Comptabilité : idem que précédemment
  • Onglet Général :
    • Nom du modèle : OpenVPN_Client
    • Nom complet : OpenVPN Client Certificate
    • Période de validité : 1 an
  • Onglet Nom du sujet : idem que précédemment
  • Onglet Traitement de la demande : idem que précédemment
  • Onglet Extension :
    • Utilisation de la clé : Signature numérique + Chiffrement de clé
    • Stratégies d'application :
      • Ajouter → Authentification du client → OK

  • Onglet Sécurité : idem que précédemment
  • Valider avec OK

Publication des modèles dans la CA :

  • Retourner dans certsrv.msc (Autorité de certification)
  • Développer votre CA
  • Clic droit sur Modèles de certificats → Nouveau → Modèle de certificat à délivrer
  • Sélectionner OpenVPN_Server et OpenVPN_Client
  • OK
  • Vérification : sur Powershell en admin rentrer la commance certutil -CATemplates
    Vous devriez voir ces éléments ci-dessous :
    PS C:\Users\Administrateur> certutil -CATemplates
    OpenVPN_Server: OpenVPN_Server_Certificate -- Inscription automatique
    OpenVPN_Client: OpenVPN_Client_Certificate -- Inscription automatique
    IPSECIntermediateOffline: IPSec (demande hors connexion) -- Inscription automatique: Accès refusé.
    CEPEncryption: Chiffrement CEP -- Inscription automatique: Accès refusé.
    EnrollmentAgentOffline: Agent d’inscription Exchange (demande hors connexion) -- Inscription automatique: Accès refusé.
    DirectoryEmailReplication: Réplication de la messagerie de l’annuaire -- Inscription automatique: Accès refusé.
    DomainControllerAuthentication: Authentification du contrôleur de domaine -- Inscription automatique: Accès refusé.
    KerberosAuthentication: Authentification Kerberos -- Inscription automatique: Accès refusé.
    EFSRecovery: Agent de récupération EFS -- Inscription automatique: Accès refusé.
    EFS: EFS basique -- Inscription automatique: Accès refusé.
    DomainController: Contrôleur de domaine -- Inscription automatique: Accès refusé.
    WebServer: Serveur Web -- Inscription automatique: Accès refusé.
    Machine: Ordinateur -- Inscription automatique: Accès refusé.
    User: Utilisateur -- Inscription automatique: Accès refusé.
    SubCA: Autorité de certification secondaire -- Inscription automatique: Accès refusé.
    Administrator: Administrateur -- Inscription automatique: Accès refusé.
    CertUtil: -CATemplates La commande s’est terminée correctement.
    PS C:\Users\Administrateur>
Mise en place du serveur OpenVPN :
Installation d’OpenVPN sur le serveur VPN sous Debian :

Installation des paquets :

Sur le serveur VPN (172.30.0.2), Debian 13 :

  • Ouvrir une invite de commande (cmd) et se connecter en ssh :
    ssh [email protected]
    [email protected]'s password:
    Linux VPN 6.12.43+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.43-1 (2025-08-27) x86_64
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    cedric@VPN:~$
  • Se connecter en super utilisateur :
    cedric@VPN:~$ su
    Mot de passe :
    root@VPN:/home/cedric#
  • Mise à jour :
    apt update
    apt upgrade -y
  • installation d’OpenVPN et outils :
    apt install openvpn openssl -y
  • Ajout au PATH (Ajoute /usr/sbin/ à la liste des endroits où chercher les commandes) :
    export PATH=$PATH:/usr/sbin

Création de la structure de répertoires :

  • Répertoires OpenVPN :
    mkdir -p /etc/openvpn/server
    mkdir -p /var/log/openvpn
  • Répertoires de travail :
    mkdir -p /root/cert-requests
    mkdir -p /root/client-configs
  • Permissions :
    chmod 700 /etc/openvpn/server
    chmod 755 /var/log/openvpn
Génération du certificat serveur d’OpenVPN :

Génération du certificat sur le serveur AD :

  • Sur le serveur AD, ouvrir PowerShell en mode admin
  • Créer le fichier de demande de certificat :
    $RequestFile = @"
    [Version]
    Signature="`$Windows NT`$"
    
    [NewRequest]
    Subject = "CN=vpn-server-openvpn"
    KeySpec = 1
    KeyLength = 2048
    Exportable = TRUE
    MachineKeySet = TRUE
    RequestType = PKCS10
    KeyUsage = 0xa0
    
    [EnhancedKeyUsageExtension]
    OID=1.3.6.1.5.5.7.3.1 ; Server Authentication
    OID=1.3.6.1.5.5.7.3.2 ; Client Authentication
    
    [Extensions]
    2.5.29.17 = "{text}"
    _continue_ = "dns=vpn.mysoccbt.fr&"
    _continue_ = "dns=vpn-server-openvpn&"
    _continue_ = "ipaddress=172.30.0.2&"
    "@
    
    $RequestFile | Out-File -FilePath C:\openvpn-server.inf -Encoding ASCII -NoNewline
    
    Write-Host "Fichier de demande créé : C:\openvpn-server.inf" -ForegroundColor Green
  • Générer la demande (CSR) :
    certreq -new C:\openvpn-server.inf C:\openvpn-server.req
    
    Write-Host "Demande générée : C:\openvpn-server.req" -ForegroundColor Green
  • Soumettre à la CA :
    Write-Host "Soumission à la CA..." -ForegroundColor Yellow
    
    certreq -submit -attrib "CertificateTemplate:OpenVPN_Server" C:\openvpn-server.req C:\openvpn-server.cer
  • Une fenêtre s'ouvre : sélectionnez votre CA et cliquez OK
  • Installer le certificat :
    certreq -accept C:\openvpn-server.cer
    
    Write-Host "Certificat installé dans le magasin de l'ordinateur" -ForegroundColor Green
  • Vérifier le certificat et exporter en PFX :
    $cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*vpn-server-openvpn*"}
    if ($cert) {
        Write-Host "" -ForegroundColor Green
        Write-Host "=====================================" -ForegroundColor Green
        Write-Host "CERTIFICAT SERVEUR CRÉÉ" -ForegroundColor Green
        Write-Host "=====================================" -ForegroundColor Green
        Write-Host "Subject    : $($cert.Subject)" -ForegroundColor Yellow
        Write-Host "Thumbprint : $($cert.Thumbprint)" -ForegroundColor Cyan
        Write-Host "Expire le  : $($cert.NotAfter)" -ForegroundColor Cyan
     $pwd = ConvertTo-SecureString -String "squall969*" -Force -AsPlainText
        Export-PfxCertificate -Cert $cert -FilePath C:\openvpn-server.pfx -Password $pwd | Out-Null
        
        Write-Host "" -ForegroundColor Green
        Write-Host "Certificat exporté : C:\openvpn-server.pfx" -ForegroundColor Green
        Write-Host "Mot de passe du PFX : squall969*" -ForegroundColor Yellow
        Write-Host "" -ForegroundColor Green
    } else {
        Write-Host "ERREUR : Le certificat n'a pas été trouvé" -ForegroundColor Red
    }
  • Si le certificat a bien été créé nous recevrons pour réponse :
    =====================================
     CERTIFICAT SERVEUR CRÉÉ
    =====================================
    Subject    : CN=vpn-server-openvpn
    Thumbprint : DBA6C47E2DF16EDD9BFE277066046A1EAB4FBAEA
    Expire le  : 02/24/2028 16:12:01
    
     Certificat exporté : C:\openvpn-server.pfx
    Mot de passe du PFX : squall969*!
    
    PS C:\Users\Administrateur>

Export du certificat racine (CA) :

  • Exporter le certificat racine en format PEM :
    $rootCert = Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Subject -like "*MySocCBt-CA*"}
    
    if ($rootCert) {
        $certBytes = $rootCert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert)
        $certBase64 = [System.Convert]::ToBase64String($certBytes)
        $certPem = "-----BEGIN CERTIFICATE-----`n"
        $certPem += ($certBase64 -replace "(.{64})", "`$1`n")
        $certPem += "`n-----END CERTIFICATE-----"
        $certPem | Out-File -FilePath "C:\ca-root.crt" -Encoding ASCII
        
        Write-Host "Certificat racine exporté : C:\ca-root.crt" -ForegroundColor Green
    } else {
        Write-Host "Certificat racine non trouvé" -ForegroundColor Red
    }
  • Vous devez maintenant avoir 2 fichiers :
    • C:\\openvpn-server.pfx (certificat serveur + clé privée)
    • C:\\ca-root.crt (certificat racine)

Transfert des fichiers vers le serveur VPN :

  • Après avoir téléchargé et installé Filezilla au préalable sur le serveur, l’ouvrir puis se connecter au serveur en rentrant l’IP, le nom d’utilisateur et le mot de passe puis le port SSH
  • Déplacer les deux fichiers générés précédemment vers le serveur VPN :
  • Sur le serveur VPN, déplacer ces deux fichiers dans le dossier /root :
    mv /home/cedric/ca-root.crt /root
    mv /home/cedric/openvpn-server.pfx /root
Extraction et installation des certificats sur Linux :

Extraction du PFX :

Sur le serveur VPN, dans le dossier /root :

  • Vérifier que le fichier PFX est présent :
    root@VPN:~# ls -l
    total 20
    -rw-rw-r-- 1 cedric cedric 2481 24 févr. 16:49 ca-root.crt
    drwxr-xr-x 2 root   root   4096 24 févr. 16:01 cert-requests
    drwxr-xr-x 2 root   root   4096 24 févr. 16:01 client-configs
    -rw-rw-r-- 1 cedric cedric 4301 24 févr. 16:49 openvpn-server.pfx
    root@VPN:~#
  • Extraire le certificat serveur (mot de passe : squall969*) :
    openssl pkcs12 -in openvpn-server.pfx -clcerts -nokeys -out server.crt
  • Extraire la clé privée (mot de passe : squall969*) :
    openssl pkcs12 -in openvpn-server.pfx -nocerts -nodes -out server.key
  • Extraire le certificat CA (mot de passe : squall969*) :
    openssl pkcs12 -in openvpn-server.pfx -cacerts -nokeys -out ca-from-pfx.crt

Vérification CRITIQUE du certificat serveur :

  • Vérifier que le Subject est bien présent :
    openssl x509 -in server.crt -noout -subject
  • Résultat attendu : subject=CN = vpn-server-openvpn
  • Si le résultat est "subject=" (vide), le certificat est défectueux. Il faut le régénérer avec un Subject valide

Installation des certificats :

  • Copier dans le répertoire OpenVPN :
    cp server.crt /etc/openvpn/server/
    cp server.key /etc/openvpn/server/
    cp ca-root.crt /etc/openvpn/server/ca.crt
  • Permissions (IMPORTANT pour la sécurité) :
    chmod 600 /etc/openvpn/server/server.key
    chmod 644 /etc/openvpn/server/server.crt
    chmod 644 /etc/openvpn/server/ca.crt
  • Vérification :
    root@VPN:~# ls -la /etc/openvpn/server/
    total 20
    drwx------ 2 root root 4096 24 févr. 17:11 .
    drwxr-xr-x 4 root root 4096 24 févr. 15:54 ..
    -rw-r--r-- 1 root root 2481 24 févr. 17:11 ca.crt
    -rw------- 1 root root 2360 24 févr. 17:11 server.crt
    -rw------- 1 root root 1952 24 févr. 17:11 server.key
    root@VPN:~#

Génération des paramètres Diffie-Hellman :

Ces paramètres sont nécessaires pour l'établissement de la connexion sécurisée entre le client et le serveur. Ils permettent de négocier une clé de session partagée de manière sécurisée.

  • Génération :
    openssl dhparam -out /etc/openvpn/server/dh2048.pem 2048
  • Vérification :
    root@VPN:~# ls -l /etc/openvpn/server
    total 16
    -rw-r--r-- 1 root root 2481 24 févr. 17:11 ca.crt
    -rw-r--r-- 1 root root  428 24 févr. 17:14 dh2048.pem
    -rw------- 1 root root 2360 24 févr. 17:11 server.crt
    -rw------- 1 root root 1952 24 févr. 17:11 server.key
    root@VPN:~#
Configuration du serveur OpenVPN :

Création du fichier de configuration :

nano /etc/openvpn/server/server.conf
  • Contenu du fichier :
    # ============================================
    # Configuration OpenVPN Server avec AD CS PKI
    # ============================================
    
    # Port et protocole
    port 1194
    proto udp
    dev tun
    
    # Certificats PKI depuis Active Directory
    ca /etc/openvpn/server/ca.crt
    cert /etc/openvpn/server/server.crt
    key /etc/openvpn/server/server.key
    dh /etc/openvpn/server/dh2048.pem
    
    # Mode serveur TLS
    tls-server
    tls-version-min 1.2
    
    # Vérification du certificat client
    remote-cert-tls client
    
    # Pool d'adresses IP pour les clients VPN
    server 10.8.0.0 255.255.255.0
    
    # Routes à pousser aux clients
    push "route 172.30.0.0 255.255.255.0"
    
    # Configuration DNS pour Active Directory
    push "dhcp-option DNS 172.30.0.1"
    push "dhcp-option DOMAIN MySocCBt.fr"
    
    # Paramètres de sécurité
    cipher AES-256-GCM
    auth SHA256
    dh none
    
    # Paramètres de connexion
    keepalive 10 120
    persist-key
    persist-tun
    
    # Isolation (sécurité)
    user nobody
    group nogroup
    
    # Logs
    status /var/log/openvpn/openvpn-status.log
    log-append /var/log/openvpn/openvpn.log
    verb 3
  • La directive dh none utilise le DH éphémère (ECDH) au lieu du fichier dh2048.pem
  • Commentez #user nobody et #group nogroup si vous rencontrez des problèmes de permissions

Test de la configuration :

  • Vérifier la syntaxe de la configuration :
    openvpn --config /etc/openvpn/server/server.conf --test-crypto
  • Tester le démarrage manuel (Ctrl+C pour arrêter) :
    openvpn --config /etc/openvpn/server/server.conf
  • ctrl + c pour arrêter
  • Pour vérifier si tout est correct, tapez la commande tail -f /var/log/openvpn/openvpn.log. Vous devriez voir en réponse :
    root@VPN:~# tail -f /var/log/openvpn/openvpn.log
    2026-02-24 21:15:01 GID set to nogroup
    2026-02-24 21:15:01 Capabilities retained: CAP_NET_ADMIN
    2026-02-24 21:15:01 MULTI: multi_init called, r=256 v=256
    2026-02-24 21:15:01 IFCONFIG POOL IPv4: base=10.8.0.4 size=62
    2026-02-24 21:15:01 Initialization Sequence Completed
    2026-02-24 21:16:41 event_wait : Interrupted system call (fd=-1,code=4)
    2026-02-24 21:16:41 net_route_v4_del: 10.8.0.0/24 via 10.8.0.2 dev [NULL] table 0 metric -1
    2026-02-24 21:16:41 Closing TUN/TAP interface
    2026-02-24 21:16:41 net_addr_ptp_v4_del: 10.8.0.1 dev tun0
    2026-02-24 21:16:41 SIGINT[hard,] received, process exiting
Configuration du routage et du pare-feu :

Activation du routage IP :

  • Vérification de la ligne existante :
    sysctl net.ipv4.ip_forward
  • Si le retour de commande est net.ipv4.ip_forward = 0, rajouter la ligne :
    nano /usr/lib/sysctl.d/50-default.conf
    
    # Rajouter la ligne à la fin du fichier
    net.ipv4.ip_forward=1
  • Activer les changements :
    sysctl -p /usr/lib/sysctl.d/50-default.conf
  • Vérification :
    root@VPN:~# sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1
    root@VPN:~#

Configuration d'iptables pour le NAT :

  • Installation d'iptables :
    apt install iptables -y
  • Nettoyage des règles existantes
    iptables -F
    iptables -t nat -F
    iptables -X
  • Politiques par défaut :
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
  • Règles NAT pour le VPN :
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens33 -j MASQUERADE
  • Règles FORWARD :
    iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
    iptables -A FORWARD -d 10.8.0.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
  • Sauvegarde des règles pour persistance au redémarrage :
    netfilter-persistent save
  • Pourquoi iptables est nécessaire même avec pfSense ?
    PfSense gère le routage WAN ↔ LAN, mais le serveur VPN doit router le trafic entre le tunnel VPN (10.8.0.0/24) et le LAN (172.30.0.0/24). Le MASQUERADE permet aux machines du LAN de répondre au réseau VPN.
Démarrage et vérification du service OpenVPN :

Démarrage du service :

  • Activer au démarrage
    systemctl enable openvpn-server@server
  • Démarrage du service :
    systemctl start openvpn-server@server
  • Vérification du statut :
    systemctl status openvpn-server@server
Configuration de PFSense :
Génération du certificat client :
Création du certificat client sur le serveur AD :
  • Sur le serveur AD, ouvrir Powershell en mode admin
  • Fichier de demande pour le client :
    $ClientRequestFile = @"
    [Version]
    Signature="`$Windows NT`$"
    
    [NewRequest]
    Subject = "CN=client1-vpn"
    KeySpec = 1
    KeyLength = 2048
    Exportable = TRUE
    MachineKeySet = TRUE
    RequestType = PKCS10
    KeyUsage = 0xa0
    
    [EnhancedKeyUsageExtension]
    OID=1.3.6.1.5.5.7.3.2 ; Client Authentication
    
    [Extensions]
    2.5.29.17 = "{text}"
    _continue_ = "dns=client1-vpn&"
    "@
    
    $ClientRequestFile | Out-File -FilePath C:\openvpn-client1.inf -Encoding ASCII -NoNewline
  • Générer la demande :
    certreq -new C:\openvpn-client1.inf C:\openvpn-client1.req
  • Soumettre à la CA :
    certreq -submit -attrib "CertificateTemplate:OpenVPN_Client" C:\openvpn-client1.req C:\openvpn-client1.cer

  • Installer le certificat :
    certreq -accept C:\openvpn-client1.cer
  • Vérification et export en PFX :
    $clientCert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*client1-vpn*"}
    if ($clientCert) {
        Write-Host "Certificat client créé : $($clientCert.Subject)" -ForegroundColor Green
    $pwd = ConvertTo-SecureString -String "squall969*" -Force -AsPlainText
        Export-PfxCertificate -Cert $clientCert -FilePath C:\openvpn-client1.pfx -Password $pwd | Out-Null
        
        Write-Host "Certificat client exporté : C:\openvpn-client1.pfx" -ForegroundColor Green
        Write-Host "Mot de passe : squall969*" -ForegroundColor Yellow
    }
Transfert et extraction sur le serveur VPN :
  • Transférez openvpn-client1.pfx vers le serveur VPN Linux.
    • Ouvrir Filezilla et se connecter au serveur VPN comme précédemment
    • Transférer le fichier vers le serveur VPN
    • Le déplacer ensuite dans /root/client-configs :
      mv /home/cedric/openvpn-client1.pfx /root/client-configs
  • Sur le serveur VPN :
    cd /root/client-configs
  • Extraire le certificat client (mot de passe : squall969*) :
    openssl pkcs12 -in openvpn-client1.pfx -clcerts -nokeys -out client1.crt
  • Extraire la clé privée client (mot de passe : squall969*) :
    openssl pkcs12 -in openvpn-client1.pfx -nocerts -nodes -out client1.key
  • Copier le CA :
    cp /etc/openvpn/server/ca.crt .
  • Vérifier les fichiers :
    root@VPN:~/client-configs# ls -l
    total 20
    -rw-r--r-- 1 root   root   2481 24 févr. 23:00 ca.crt
    -rw------- 1 root   root   2275 24 févr. 22:58 client1.crt
    -rw------- 1 root   root   1956 24 févr. 22:58 client1.key
    -rw-rw-r-- 1 cedric cedric 4245 24 févr. 22:53 openvpn-client1.pfx
    root@VPN:~/client-configs#
Création du fichier client .ovpn :
  • Toujours dans le même dossier : /root/client-configs
  • Créer le fichier .ovpn :
    nano client1.ovpn
  • Contenu du fichier :
    # Configuration client OpenVPN avec certificats AD CS
    client
    dev tun
    proto udp
    
    # Adresse du serveur VPN (IP WAN de pfSense ou IP publique)
    remote 192.168.17.136 1194
    
    # Paramètres de connexion
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    
    # Vérification du certificat serveur
    remote-cert-tls server
    
    # Paramètres de sécurité (doivent correspondre au serveur)
    cipher AES-256-GCM
    auth SHA256
    
    # Niveau de logs
    verb 3
    
    # Certificats intégrés
    <ca>
    </ca>
    
    <cert>
    </cert>
    
    <key>
    </key>
  • Dans le fichier client1.ovpn, coller :
    • Le contenu de ca.crt entre <ca> et </ca>
    • Le contenu de client1.crt entre <cert> et </cert>
    • Le contenu de client1.key entre <key> et </key>
Configuration du client windows :
Installation d'OpenVPN sur Windows :
  • Télécharger OpenVPN Community Edition : via ce lien
  • Installer avec les options par défaut
  • Redémarrer si demandé
Installation du fichier de configuration :
  • Récupérer sur le poste client le fichier client1.ovpn
    • Ouvrir un dossier de partage sur le serveur AD :
      • Créer un dossier nommé Partage dans C:\Users\Administrateur\Documents
      • Faire clic droit sur le dossier Partage, Propriété puis aller à l’onglet Partage
      • Aller dans Partage avancé puis cocher Partager ce dossier

    • Dans le dossier Partage, faite clic droit > nouveau > Document texte
    • Vous appellerez ce fichier client1.ovpn et vous y copierez le contenu du fichier du même nom créer dans le serveur VPN
    • Sur le poste client, aller dans Réseau puis activer la découverte de réseau et le partage de fichier
    • Aller ensuite dans SERVEUR01 > Partage et vous pourrez trouver le fichier client1.ovpn créé précédemment
  • Lancer openVPN Connect et importer le fichier client1.ovpn (il est aussi possible de lancer ce fichier pour l’importer automatiquement)
Première connexion VPN :
  • Dans un premier temps déconnecté le client du réseau et le connecter en NAT. Pour qu’il soit sur un autre réseau.
  • Lancer OpenVPN connect et connectez vous
  • Dès que la pastille est verte vous êtes connecté
  • Nous pouvons désormais tester la connexion :
    • avec un ping sur le serveur AD :
    • ou une connexion au dossier partagé :