Erreur d’authentification de certificat SSL RDP sur Windows Server 2019 : CN, SAN et installation pas à pas

À chaque connexion RDP vers Windows Server 2019, un avertissement « SSL Certificate Authentication Error » s’affiche ? Voici comment choisir le bon CN/SAN et installer correctement un certificat pour éliminer l’alerte — pas à pas, avec méthodes GUI et PowerShell, plus un volet dépannage.

Sommaire

Erreur d’authentification de certificat SSL lors d’une connexion Remote Desktop (RDP) à Windows Server 2019

Vue d’ensemble

Le service RDP (TermService) présente par défaut un certificat auto‑signé. Les clients (mstsc.exe, clients macOS/Linux, clients HTML5 derrière une Gateway, etc.) ne lui font pas confiance : d’où l’avertissement systématique. Pour le supprimer, deux prérequis sont indispensables :

  • Un certificat serveur émis par une AC de confiance et lié au service RDP du serveur cible.
  • Un nom (FQDN) utilisé par les clients qui correspond exactement aux identités déclarées dans le certificat (SAN/CN).

Réponse & solution rapide (synthèse opérationnelle)

PointDétails pratiques
Choix du Common NameRenseigner le FQDN exact utilisé par les clients RDP (ex. server.example.com). Si tous les postes se connectent via cwrtab.example.com, c’est ce FQDN qui doit figurer. Bon à savoir : les clients modernes se basent d’abord sur le SAN; répliquez aussi ce FQDN en SAN.
SAN (Subject Alt Name)Inclure toutes les variantes utiles : DNS=server.example.com, DNS=alias.example.com, éventuellement IP=10.0.0.10 si des utilisateurs se connectent par IP. Un wildcard (*.example.com) est accepté par RDP pour des hôtes correspondant au motif, mais privilégiez l’exact match pour éviter des surprises.
Génération & obtentionGénérer une CSR depuis MMC ▸ Certificats (ordinateur local) (All Tasks ▸ Advanced Operations ▸ Create Custom Request) ou via certreq.exe. Soumettre à une AC publique ou interne et récupérer un certificat Server Authentication (EKU OID 1.3.6.1.5.5.7.3.1) avec clé privée (exportable si besoin de PFX).
Installation pour RDPImporter le .pfx (clé privée incluse) dans MMC ▸ Certificates (Local Computer) ▸ Personal ▸ Certificates. Assigner le certificat au service RDP : Cas standalone : copier le certificat vers Remote Desktop ▸ Certificates, ou définir son thumbprint via WMI/PowerShell (voir script plus bas). Cas déploiement RDS : Server Manager ▸ Remote Desktop Services ▸ Overview ▸ Tasks ▸ Edit Deployment Properties ▸ Certificates, remplacer/assigner pour chaque rôle concerné (RD Session Host/CB/Web/Gateway). Redémarrer Remote Desktop Services (TermService) ou le serveur.
VérificationTester avec mstsc.exe en saisissant exactement le FQDN déclaré. Dans la fenêtre, cliquer sur « Afficher le certificat » : la chaîne doit être approuvée et l’identité correspondre. En cas d’alerte, contrôler la chaîne côté client et l’exactitude du nom utilisé.
Cas particulier IISSi IIS héberge du HTTPS sur le même serveur : importer le PFX dans IIS Manager ▸ Server Certificates, puis lier dans Bindings (type HTTPS, port 443). RDP et IIS consomment séparément le certificat même s’il peut être identique.
Bonnes pratiquesMise à jour des certificats racine sur les clients, automatisation du renouvellement (ex. win‑acme/ACME), désactivation de SSL 3.0/TLS 1.0/1.1 et durcissement TLS, usage de NLA et, si possible, RD Gateway + MFA.

CN vs SAN : ce que RDP vérifie réellement

Historiquement, les clients validaient le Common Name (CN). Désormais, la vérification repose d’abord sur Subject Alternative Name. Concrètement :

  • Le FQDN utilisé par vos utilisateurs (server.example.com) doit figurer en SAN=DNS (et, par prudence, en CN).
  • Si certains saisissent une adresse IP, ajoutez SAN=iPAddress (ex. iPAddress=10.0.0.10). Attention : les AC publiques n’émettent généralement pas de certificats pour IP privées ; ce cas se gère plutôt avec une AC interne.
  • Les noms internes non publics (.local, courts/NetBIOS) sont refusés par les AC publiques ; utilisez une AC interne ou mettez en place un split‑DNS avec un FQDN public.
  • Les wildcards (*.example.com) fonctionnent pour des hôtes correspondant (srv01.example.com), mais pas pour des IPs ni des sous‑domaines multiples (*.a.b.example.com*.example.com). Préférez l’exactitude.

Exemples de nommage (à adapter)

ContexteNom saisi par les utilisateursCN recommandéSAN recommandéRemarques
Serveur uniqueserver.example.comserver.example.comDNS=server.example.comCas le plus simple.
Alias DNSrdp.example.comrdp.example.comDNS=rdp.example.com, DNS=server.example.comInclure l’alias et le nom réel si les deux sont employés.
Connexion par IP10.0.0.10server.example.comDNS=server.example.com, iPAddress=10.0.0.10Nécessite une AC interne (IP privée dans le SAN).
Wildcardsrv01.example.com*.example.comDNS=*.example.comPratique, mais moins strict. Évitez pour des postes critiques.
Ferme RDS/Load Balancerrdp-vip.example.comrdp-vip.example.comDNS=rdp-vip.example.comLe nom virtuel (VIP) doit être celui présenté par la cible.

Générer la CSR : GUI (MMC) et certreq

Méthode GUI (MMC)

  1. Ouvrir MMCFile ▸ Add/Remove Snap‑inCertificatesComputer accountLocal computer.
  2. Aller dans Certificates (Local Computer) ▸ Personal ▸ Certificates.
  3. Right‑click ▸ All Tasks ▸ Advanced Operations ▸ Create Custom Request….
  4. Choisir un modèle « sans modèle (CNG ou legacy) » si AC publique, ou un template interne de type « Web Server/Server Authentication » si AD CS.
  5. Dans les propriétés :
    • Subject : Common Name = FQDN cible.
    • Alternative name : ajouter tous les SAN utiles (DNS et iPAddress si requis).
    • Cryptographie : privilégier RSA 2048/3072 pour une compatibilité RDP maximale.
  6. Exporter la CSR (.req ou .csr) et soumettre à votre AC. Une fois émis, récupérez .cer et, si possible, un .pfx (certificat + clé privée + chaîne).

Méthode certreq (précise et scriptable)

Créez un fichier rdp.inf :

[Version]
Signature="$Windows NT$"

[NewRequest]
Subject = "CN=server.example.com"
KeySpec = 1
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
RequestType = PKCS10
SMIME = FALSE
KeyUsage = 0xa0
FriendlyName = "RDP server.example.com"

[Extensions]
2.5.29.17 = "{text}"
*continue* = "dns=server.example.com&"
*continue* = "dns=alias.example.com&"
*continue* = "ipaddress=10.0.0.10"

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1 

Puis exécutez :

certreq -new rdp.inf rdp.req
REM Soumettre rdp.req à l'AC, récupérer rdp.cer
certreq -accept rdp.cer

Astuce : si vous recevez un .cer sans PFX, vous pouvez l’associer à la clé privée générée par certreq -accept. À défaut, réexportez ensuite en .pfx depuis la console MMC (inclure la clé privée et la chaîne).

Installation & liaison au service RDP

Étapes GUI — serveur RDP standalone

  1. Importer le PFX dans Certificates (Local Computer) ▸ Personal ▸ Certificates (mot de passe PFX requis). Vérifier que la colonne « Has Private Key » / « Vous disposez d’une clé privée… » est bien présente.
  2. Option A : store dédié — Copier le certificat vers Certificates (Local Computer) ▸ Remote Desktop ▸ Certificates. De nombreuses configurations lient automatiquement le dernier certificat valide avec EKU Server Auth présent dans ce magasin.
  3. Option B : assignation explicite — Définir l’empreinte (thumbprint) via WMI/PowerShell (méthode la plus déterministe, voir ci‑dessous).
  4. Redémarrer le service TermService : Restart-Service TermService ou via la console Services.

Étapes GUI — déploiement RDS (CB/Web/Gateway/SH)

  1. Ouvrir Server ManagerRemote Desktop ServicesOverview.
  2. Cliquer sur TasksEdit Deployment PropertiesCertificates.
  3. Pour chaque rôle (Connection Broker – Publishing, Connection Broker – Enable SSO, RD Web Access, RD Gateway, RD Session Host), Replace et import du PFX, puis Apply/OK.
  4. Vérifier l’état « Trusted » pour chaque rôle.

Assignation par PowerShell (rapide et reproductible)

Ce bloc importe le PFX, récupère le thumbprint et l’assigne au service RDP, puis redémarre le service :

$pfx = "C:\path\certificat.pfx"
$pwd = ConvertTo-SecureString -String 'MotDePassePfx' -AsPlainText -Force
Import-PfxCertificate -FilePath $pfx -CertStoreLocation Cert:\LocalMachine\My -Password $pwd | Out-Null
$thumb = (Get-PfxCertificate $pfx).Thumbprint -replace ' '
wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="$thumb" | Out-Null
Restart-Service TermService

Vérifications post‑installation

  • Côté serveur :
    • Get-ChildItem Cert:\LocalMachine\My : le certificat doit être présent, valide (NotAfter non dépassé), avec EKU Server Authentication.
    • Get-ChildItem Cert:\LocalMachine\Remote Desktop\Certificates (si utilisé) : présence du bon certificat.
  • Côté client :
    • Dans mstsc, saisir le FQDN exact ; cliquer sur « Afficher le certificat » : l’émetteur doit être de confiance, l’identité correspondre.
    • Si la chaîne n’est pas approuvée : installer l’intermédiaire/racine manquants côté client (ou déployer via GPO).

Propriétés minimales du certificat RDP

PropriétéValeur recommandéePourquoi
Key AlgorithmRSA 2048 ou 3072Compatibilité maximale avec Schannel/RDP (clients anciens inclus).
EKUServer Authentication (1.3.6.1.5.5.7.3.1)Obligatoire pour usage serveur TLS.
Key UsageDigital Signature, Key EnciphermentConforme aux usages TLS serveur.
Subject (CN)FQDN exact (ex. server.example.com)Lisible par les outils et utile en fallback.
SANDNS=FQDN (+ alias), iPAddress si nécessaireÉléments réellement vérifiés par les clients.
Validité13 mois max (AC publique) ou selon politique interneAligné sur les bonnes pratiques actuelles.

Dépannage guidé

Symptômes → Causes → Correctifs

SymptômeCause probableCorrectif
Avertissement « Nom ne correspond pas »Le FQDN saisi n’est pas dans le SAN/CN.Utiliser exactement le nom déclaré ; sinon regénérer un certificat incluant ce nom en SAN (ou ajouter un alias DNS et l’utiliser).
« La chaîne n’est pas approuvée » (0x80090325)AC inconnue du client ou intermédiaire manquant.Installer la chaîne (racine/intermédiaires) sur le poste client ; en domaine, déployer via GPO (Trusted Root/Intermediate).
« Ce certificat ne possède pas de clé privée »Import d’un .cer au lieu d’un .pfx.Réimporter un PFX contenant la clé privée. Vérifier dans MMC que l’icône montre la clé et que « You have a private key… » apparaît.
Toujours l’ancien certificat après renouvellementTermService lié à un ancien thumbprint.Réancrer le nouveau certificat via WMI (voir script) et redémarrer TermService.
Handshake TLS échoue (événements Schannel 36888/36882)Protocoles/chiffres incompatibles ou chaîne invalide.Assurer TLS 1.2 activé, désactiver SSL 3.0/TLS 1.0/1.1 si possible, corriger la chaîne de certification.
Connexion par IP → avertissement persistantIP absente du SAN.Ajouter SAN iPAddress (AC interne) ou forcer l’usage d’un FQDN résolu vers l’IP.

Commandes utiles

# Lister les certifs serveur (magasin personnel)
Get-ChildItem Cert:\LocalMachine\My | 
  Where-Object { $_.EnhancedKeyUsageList.FriendlyName -contains "Server Authentication" } |
  Format-Table Subject, Thumbprint, NotAfter

# Voir le certificat RDP (store dédié s'il est utilisé)

Get-ChildItem "Cert:\LocalMachine\Remote Desktop\Certificates"

# Lire l'empreinte liée (WMIC)

wmic /namespace:\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting GET SSLCertificateSHA1Hash

# Redémarrer le service RDP

Restart-Service TermService 

Automatiser le renouvellement (exemple)

Si vous renouvelez automatiquement (ACME/win‑acme, AD CS auto‑enrollment), programmez une tâche qui relie le dernier certificat valide au service RDP :

$subjectFqdn = "CN=server.example.com"

$cert = Get-ChildItem Cert:\LocalMachine\My |
Where-Object {
$*.Subject -eq $subjectFqdn -and
$*.HasPrivateKey -and
($*.EnhancedKeyUsageList | Where-Object { $*.ObjectId -eq "1.3.6.1.5.5.7.3.1" })
} |
Sort-Object NotAfter -Descending |
Select-Object -First 1

if ($cert) {
$thumb = ($cert.Thumbprint -replace ' ')
wmic /namespace:\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="$thumb" | Out-Null
Restart-Service TermService
} 

Conseil : créez la tâche planifiée sur l’évènement de renouvellement du certificat (ou exécutez quotidiennement). Retirez les espaces éventuels du thumbprint et attention aux caractères invisibles lors d’un copier‑coller depuis MMC.

Différences RDP vs IIS (rappel)

  • RDP lit un certificat lié au service (WMI / magasin Remote Desktop ▸ Certificates), utilisé pour chiffrer/identifier la session RDP.
  • IIS lit depuis Personal et s’attache via un binding HTTPS par site. Les deux usages sont indépendants ; vous pouvez toutefois réutiliser le même PFX si le nom convient.

Cas particuliers

RDS Gateway (RDG)

La Gateway publie son propre nom (ex. rdg.example.com) ; elle nécessite son certificat « Server Authentication ». Le Session Host derrière la Gateway peut, lui aussi, utiliser un certificat (pour le canal interne). Les deux certificats ont des identités différentes.

Ferme RDS / Broker / Web

Dans un déploiement RDS complet, plusieurs rôles consomment un certificat : RD Connection Broker – Publishing, RD Connection Broker – Enable SSO, RD Web Access, RD Gateway, RD Session Host. Passez par Server Manager ▸ RDS ▸ Edit Deployment Properties ▸ Certificates pour tous les aligner et éviter des avertissements épars.

Checklist sécurité & robustesse

  • NLA (Network Level Authentication) activée pour réduire la surface d’attaque.
  • TLS 1.2 activé, SSL 3.0/TLS 1.0/1.1 désactivés si compatibilité OK.
  • Limiter RDP aux sous‑réseaux attendus (pare‑feu), privilégier une RD Gateway + MFA depuis l’externe.
  • Surveiller l’expiration et créer des alertes (échéances < 30 jours).
  • Déployer la chaîne (racine/intermédiaires) via GPO pour tous les clients du domaine.

FAQ express

Puis‑je n’indiquer que le CN ?
Non. Les clients modernes vérifient d’abord le SAN. Le CN seul est insuffisant : répétez le FQDN dans SAN.

Wildcard ou FQDN exact ?
Le wildcard fonctionne mais l’exactitude est préférable. En prod critique, utilisez des FQDN explicites.

Connexion par nom court (NetBIOS) ?
Évitez. Utilisez un FQDN. Les AC publiques n’émettent pas pour des noms internes courts ; une AC interne le peut, mais standardisez l’usage du FQDN.

ECDSA possible ?
Oui côté Schannel, mais la compatibilité RDP avec des clients hérités peut varier. RSA 2048/3072 reste le meilleur compromis.

Pas à pas détaillé (récapitulatif consolidé)

  1. Identifier le nom utilisé par les clients (FQDN unique recommandé). Décider si un alias/vip ou une IP sont nécessaires.
  2. Préparer la CSR : CN = FQDN ; SAN = FQDN (+ alias, IP) ; EKU = Server Auth ; RSA 2048+.
  3. Obtenir le certificat auprès d’une AC (publique si FQDN public, interne sinon). Récupérer idéalement un PFX avec chaîne complète.
  4. Importer le PFX dans Local Computer ▸ Personal. Vérifier la clé privée et la chaîne.
  5. Lier au service RDP :
    • Soit copie vers Remote Desktop ▸ Certificates,
    • Soit assignation explicite via WMI/PowerShell (recommandé).
  6. Redémarrer TermService et tester avec le FQDN exact. Valider l’absence d’avertissement.
  7. Automatiser le renouvellement et l’assignation. Mettre en place des alertes avant expiration.

Cas particulier IIS (détaillé)

  1. Ouvrir IIS Manager ▸ Server Certificates ▸ Import : choisir le PFX et le mot de passe.
  2. Dans Bindings du site, Add/Modify : type https, port 443, SNI si plusieurs sites, sélectionner le certificat importé.
  3. Tester en HTTPS. Rappel : IIS et RDP ont des liaisons distinctes ; modifier l’un n’affecte pas l’autre.

Extrait PowerShell prêt à l’emploi

# Paramétrer ces variables
$pfx = "C:\Certs\rdp_server.pfx"
$pwd = ConvertTo-SecureString -String 'MotDePassePfx' -AsPlainText -Force

# 1) Importer le PFX (magasin Ordinateur local\Personnel)

Import-PfxCertificate -FilePath $pfx -CertStoreLocation Cert:\LocalMachine\My -Password $pwd | Out-Null

# 2) Récupérer l'empreinte et l'affecter au service RDP

$thumb = (Get-PfxCertificate $pfx).Thumbprint -replace ' '
wmic /namespace:\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="$thumb" | Out-Null

# 3) Redémarrer le service RDP pour prise en compte

Restart-Service TermService 

En résumé

Pour supprimer l’alerte « SSL Certificate Authentication Error » en RDP sur Windows Server 2019 : utilisez un certificat Server Auth dont le SAN contient le FQDN exact (et, si besoin, les alias/IP), importez‑le avec la clé privée dans le magasin Local Computer ▸ Personal, puis assignez‑le explicitement au service RDP (WMI/PowerShell ou Server Manager en déploiement RDS). Validez enfin la chaîne sur les postes clients et automatisez le renouvellement pour rester serein.


Annexe : raisons de l’avertissement initial

  • Certificat auto‑signé par défaut : non approuvé par les clients.
  • Nom saisi ≠ CN/SAN du certificat : « Nom ne correspond pas ».
  • Chaîne incomplète côté client : intermédiaire/racine manquants.

Annexe : lignes directrices supplémentaires

  • Utiliser un alias stable (ex. rdp.example.com) pour éviter de regénérer le certificat à chaque changement d’hôte.
  • Éviter les caractères spéciaux/espaces dans l’empreinte lors de scripts (nettoyer les espaces invisibles).
  • Documenter la procédure de rotation (qui fait quoi, quand, avec quel outil) et tester en pré‑prod.
Sommaire