La configuration d'un serveur OpenSSH sous Windows est quelque peu déroutante au début.
Voici donc comment configurer proprement une connexion SSH par clefs vers un serveur Windows.
Nous allons ici prendre pour exemple 2 ordinateurs :
- Un client Windows 11 IP : 192.168.10.194
- Un serveur Windows 2025 en Core (histoire de voir que ça n'a rien de complexe !) : IP : 192.168.10.190
Nous allons nous concentrer sur la connexion par clefs à l'utilisateur Administrateur sur le serveur Windows.
En mode Server Core, depuis une invite PowerShell ouvert en tant qu'Administrateur :
# Installer le serveur OpenSSH est automatiser le démarrage du service.
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*' | Add-WindowsCapability -Online
Set-Service -Name sshd -StartupType 'Automatic'
# Créer une règle de pare-feu pour autoriser les connexions SSH entrantes :
New-NetFirewallRule -Name "OpenSSH-Inbound" -DisplayName "OpenSSH-Inbound" -Protocol TCP -Direction Inbound -Action Allow -LocalPort 22
# Démarrer le service sshd immédiatement
Start-Service sshd
# Vérifier le statut
Get-Service sshd
Depuis une invite PowerShell :
# Vérification rapide
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
# Si non installé, l'installer :
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Depuis PowerShell sur le client :
# Générer une paire de clés SSH (algorithme Ed25519 recommandé)
ssh-keygen -t ed25519
Quand demandé :
Résultat :
Votre clé privée est : C:\Users\<Nom>\.ssh\id_ed25519
Votre clé publique est : C:\Users\<Nom>\.ssh\id_ed25519.pub
Puisque le serveur Windows est en Core, nous allons copier la clé publique par SSH en demandant temporairement une connexion par mot de passe.
Voici comment faire depuis le client :
# Récupèrer la clé publique
$authorizedKey = Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"
# Préparer la commande distante pour ajouter la clé publique dans le fichier administrateur
$remotePowershell = @"
powershell -Command `"Add-Content -Force -Path C:\ProgramData\ssh\administrators_authorized_keys -Value '$authorizedKey'; icacls.exe C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant Administrateurs:F /grant SYSTEM:F`"
"@
# Connexion initiale avec mot de passe administrateur pour exécuter la commande
ssh Administrateur@192.168.10.190 $remotePowershell
Lors de la première connexion SSH, accepter l'empreinte (fingerprint) en tapant yes et fournir le mot de passe du compte Administrateur du serveur Windows quand demandé.
# SID universel pour les administrateurs
$remotePowershell = @"
powershell -Command `"Add-Content -Force -Path C:\ProgramData\ssh\administrators_authorized_keys -Value '$authorizedKey'; icacls.exe C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant *S-1-5-32-544:F /grant SYSTEM:F`"
"@
Sur le client (PowerShell en mode Administrateur) :
# Activer ssh-agent
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
# Charger la clé privée
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"
⚠️ Pour une sécurité maximale :
Après avoir chargé la clé privée dans l'agent, la copier sur un support sécurisé externe puis la supprimer de l'ordinateur local.
La connexion par clé publique est désormais configurée.