La connexion à distance à un serveur en SSH peut se faire avec des certificats dont le format est spécifique à OpenSSH.
Avec Debian, la configuration d'un serveur SSH se fait dans le fichier /etc/ssh/sshd_config :
Pour vérifier le paramétrage du serveur SSH, lancez la commande suivante en mode debug :
$ sudo /usr/sbin/sshd -d
La commande suivante permet d'afficher ces différents clés publiques d'un serveur SSH (RSA, ECDSA et ED25519):
$ ssk-keyscan adresseIPserveurssh
Utilisation de l'utilitaire ssh-keygen avec les options possibles suivantes :
$ ssh-keygen -C "Charles Técher"
Les clés privée et publique sont enregistrées dans le dossier ~/.ssh : id_ed25519 et id_ed25519.pub.
$ chmod 600 ~/.ssh/id_ed25519
La passphrase de la clé privée peut être modifiée avec la commande suivante :
$ ssh-keygen -p -f .ssh/id_ed25519
La clé publique peut être affichée (et générée) à partir de la clé privée :
$ ssh-keygen -y -f .ssh/id_ed25519
Sur le serveur distant, vous souhaitez permettre une authentification avec votre clé publique ssh.
Pour cela, il suffit de copier le contenu de votre clé publique dans le fichier ~/.ssh/authorized_keys du compte linux du serveur, compte avec lequel vous souhaitez ouvrir une session.
ssh-copy-id sio@ipserveur
cat ~/.ssh/id_ed25519.pub | ssh sio@ipserveur "cat >> ~/.ssh/authorized_keys"
Votre client SSH va vérifier l'identité du serveur distant avant de se connecter. Le fichier /etc/ssh/ssh_config permet de configurer le client SSH pour tous les utilisateurs de votre ordinateur, et le fichier ~/.ssh/config uniquement pour l'utilisateur qui a ouvert une session.
Lors de la première connexion du client sur le serveur distant, vous recevez un message d'avertissement et vous devez confirmer, à vos risques et périls, que vous acceptez de vous connecter à ce serveur. Dans ce cas, une trace du serveur (empreinte SSHFP - SSH FingerPrint), est enregistrée dans le fichier ~/.ssh/known_hosts. Lors d'une prochaine connexion, si la trace d'une connexion précédente est trouvée, vous n'aurez plus le message d'avertissement.
La commande suivante permet de prendre connaissance de l'empreinte de la clé publique du serveur distant, et de la communiquer aux utilisateurs client pour vérification :
# sur le serveur distant $ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub # depuis votre client $ ssh sio@adresseIP "ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub"
Les clés publiques d'un serveur peuvent être changées et ne plus être celles initialement crées. C'est le cas lors d'une attaque de type Man-In-The-Middle.
De même, il n'est pas possible de garantir que la clé publique d'un client soit légitime car il est facile de générer une clé publique, avec un commentaire de son choix et de la communiquer.
L'utilisation d'un certificat ajoute des informations d'identité et ce certificat est signé par une autorité de certification reconnue.
La signature du certificat est un haché des données du certificat chiffrée par la clé privée de l'autorité de certification reconnue.
En utilisant la clé publique de l'autorité de certification reconnue, il est possible de déchiffrer la signature et de comparer ensuite les hachés.
OpenSSH permet de générer des certificats spécifiques à OpenSSH. Ce ne sont pas des certificats x509 utilisés avec SSL/TLS (https, sftp, etc.)
La création d'un certificat utilisateur ou serveur nécessite la signature par une clé privée qui représente alors l'autorité de certification.
L'autorité de certification (CA) doit être hébergée sur un serveur très sécurisé, et, de manière idéale, offline quand il n'est pas utilisé.
Pour cette démarche, la CA sera hébergée sur le serveur distant.
$ ssh-keygen -f ca_key -C "SSH cle de la CA"
Cela génère 2 fichiers :
La configuration d'un serveur distant pour utiliser des certificats OpenSSH, signés par une ou plusieurs clés privées (CA) connues de l'administrateur (configuration du serveur distant), ne nécessite plus la mise à jour sur le serveur distant d'un fichier .ssh/authorized_keys contenant les clés publiques des utilisateurs pour chaque compte du serveur distant pouvant être utilisé.
$ rm ~/.ssh/authorized_keys
Pour la création du certificat du client, il est nécessaire de préciser :
$ scp ~/.ssh/id_ed25519.pub sio@adresseIP:/home/sio
$ ssh-keygen -s ca_key -I CLIENT-PRENOM -n sio -V +365d id_ed52519.pub
Le certificat a été généré et le fichier obtenu porte le nom de la clé publique en ajoutant “-cert” : id_ed25519-cert.pub.
La commande suivant permet de visualiser le contenu du certificat :
$ ssh-keygen -L -f id_ed25519-cert.pub
id_ed25519-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com user certificate
Public key: ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY
Signing CA: ED25519 SHA256:5R5DL2MZrQelfe88lyf2zdv3UepovFcdm9NiHtplWUQ (using ssh-ed25519)
Key ID: "CLIENT-PRENOM"
Serial: 0
Valid: from 2026-06-28T20:27:00 to 2027-06-28T20:28:40
Principals:
sio
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
Remarques :
La valeur du champ Principals est importante car cela détermine l'identité présentée par le client, c'est à dire le ou les comptes qu'il souhaite utiliser pour ouvrir une session.
$ scp sio@adresseIPCA:/home/sio/id_ed25519-cert.pub ~/.ssh/
Pour valider ces certificats, il faut indiquer au serveur distant, la liste des différentes clés publiques des CA qu'il accepte comme signataires des certificats clients présentés.
$ sudo cat ~/ca_key.pub >> /etc/ssh/ssh_ca_keys
... # HostKey /etc/ssh/ssh_host_ed25519_key TrustedUserCAKeys /etc/ssh/ssh_ca_keys ...
$ sudo systemctl restart ssh
$ ssh -v sio@adresseIP ... debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519 SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Authentications that can continue: publickey,password debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Server accepts key: /home/sio/.ssh/id_ed25519 ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY Enter passphrase for key '/home/sio/.ssh/id_ed25519':
Le certificat client id-ed25519-cert.pub, signé avec la clé privée de la CA ca_key vous a permis de vous authentifier sur le serveur distant, sans mot de passe. Si vous avez défini une passphrase pour votre clé privée, vous avez uniquement été amené à l'indiquer.
$ sudo adduser btssio
$ ssh -v btssio@adresseIP ... debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519 SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Authentications that can continue: publickey,password debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Authentications that can continue: publickey,password debug1: Trying private key: /home/sio/.ssh/id_ed25519_sk debug1: Trying private key: /home/sio/.ssh/id_xmss debug1: Trying private key: /home/sio/.ssh/id_dsa debug1: Next authentication method: password btssio@10.187.35.100's password:
L'authentification par certificat n'a pas aboutie et vous devez vous authentifier avec le mot de passe du compte.
Rappel : lors de la création de votre certificat, seul le principal sio a été indiqué.
Il est nécessaire de recréer votre certificat client en définissant comme principal, les deux comptes, sio (ou celui à votre nom) et le nouveau (btssio).
* Création à nouveau du certificat client sur le serveur jouant le rôle de CA en définissant les deux comptes comme "principals" :
$ ssh-keygen -s ca_key -I CLIENT-PRENOM -n sio,btssio -V +365d id_ed52519.pub
$ ssh-keygen -L -f id_ed25519-cert.pub
id_ed25519-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com user certificate
Public key: ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY
Signing CA: ED25519 SHA256:5R5DL2MZrQelfe88lyf2zdv3UepovFcdm9NiHtplWUQ (using ssh-ed25519)
Key ID: "CLIENT-PRENOM"
Serial: 0
Valid: from 2026-06-28T20:27:00 to 2027-06-28T20:28:40
Principals:
sio
btssio
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
Remarques : les deux comptes sio et btssio sont définis comme “principals”.
$ scp sio@adresseIPCA:/home/sio/id_ed25519-cert.pub ~/.ssh/
$ ssh -v btssio@adresseIP ... debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519 SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Authentications that can continue: publickey,password debug1: Offering public key: /home/sio/.ssh/id_ed25519 ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY debug1: Server accepts key: /home/sio/.ssh/id_ed25519 ED25519-CERT SHA256:q3u+woluMmljCo+HCKHr55oztAiZ7QVDXWkw20W02UY Enter passphrase for key '/home/sio/.ssh/id_ed25519':
Remarques :
Pour la création du certificat du serveur il est nécessaire de préciser :
$ sudo ssh-keygen -s ca_key -I SERVEUR-LOCAL -h -n localhost,127.0.0.1,adresseIP -V +365d /etc/ssh/ssh_host_ed25519_key.pub
La commande suivante permet de visualiser le contenu du certificat serveur :
$ ssh-keygen -L -f /etc/ssh/ssh_host_ed25519_key-cert.pub
/etc/ssh/ssh_host_ed25519_key-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com host certificate
Public key: ED25519-CERT SHA256:++xMosJ1oo91GoxCV77GSb7tSBzKqKVvY2kDXvXzBr0
Signing CA: ED25519 SHA256:5R5DL2MZrQelfe88lyf2zdv3UepovFcdm9NiHtplWUQ (using ssh-ed25519)
Key ID: "SERVEUR-LOCAL"
Serial: 0
Valid: from 2026-06-28T20:58:00 to 2027-06-28T20:59:19
Principals:
localhost
127.0.0.1
adresseIP
Critical Options: (none)
Extensions: (none)
Remarques : il s'agit d'un certificat utilisateur : Type …host certificate.
... HostKey /etc/ssh/ssh_host_ed25519_key HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub TrustedUserCAKeys /etc/ssh/ssh_ca_keys ...
$ sudo /usr/sbin/sshd -d sudo /usr/sbin/sshd -d
$ sudo systemctl restart ssh
Jusqu'à présent, au niveau du client, le fichier ~/.ssh/known_hosts était renseigné avec la clé publique de chaque serveur distant auquel vous avez fait confiance pour vous connecter.
Désormais, avec l'utilisation d'un certificat signé par une CA, cela n'est plus nécessaire.
Il suffit que le client dispose de la clé publique de la CA pour vérifier les certificats présenté par les serveurs distants.
echo > ~/.ssh/known_hosts
$ scp sio@adresseIPCA:/home/sio/ca_key.pub ~/.ssh/
La configuration du compte du client (côté du client) se fait en ajoutant la directive @cert-authority dans le fichier ~/.ssh/known_hosts.
Pour reconnaître tous les certificats signés par une CA précise, il faut ajouter une ligne avec le format suivant :
markers (optional) hostnames public key, comment
Remarques :
@cert-authority 10.*,*.educ-valadon-limoges.fr ssh-ed25519 AAAAC3NzaC1lZDI1N... cle publique de la CA
$ ssh -v sio@adresseIP ... debug1: Server host certificate: ssh-ed25519-cert-v01@openssh.com SHA256:++xMosJ1oo91GoxCV77GSb7tSBzKqKVvY2kDXvXzBr0, serial 0 ID "SERVEUR-LOCAL" CA ssh-ed25519 SHA256:5R5DL2MZrQelfe88lyf2zdv3UepovFcdm9NiHtplWUQ valid from 2026-06-28T23:19:00 to 2027-06-28T23:20:54 ... debug1: Host '10.xxx.yyy.zzz' is known and matches the ED25519-CERT host certificate. debug1: Found CA key in /home/sio/.ssh/known_hosts:1 ... Enter passphrase for key '/home/sio/.ssh/id_ed25519':
Remarques :
Vous n'avez pas de message d'avertissement et aucune ligne n'est ajoutée au fichier ~/.ssh/known_hosts.
@cert-authority !10.*,*.educ-valadon-limoges.fr ssh-ed25519 AAAAC3NzaC1lZDI1N... cle publique de la CA
$ ssh -v sio@adresseIP ... debug1: Server host certificate: ssh-ed25519-cert-v01@openssh.com SHA256:++xMosJ1oo91GoxCV77GSb7tSBzKqKVvY2kDXvXzBr0, serial 0 ID "SERVEUR-LOCAL" CA ssh-ed25519 SHA256:5R5DL2MZrQelfe88lyf2zdv3UepovFcdm9NiHtplWUQ valid from 2026-06-28T23:19:00 to 2027-06-28T23:20:54 ... debug1: No matching CA found. Retry with plain key ... The authenticity of host '10.xxx.yyy.zzz (10.xxx.yyy.zzz)' can't be established. ED25519 key fingerprint is SHA256:++xMosJ1oo91GoxCV77GSb7tSBzKqKVvY2kDXvXzBr0. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.187.35.100' (ED25519) to the list of known hosts. ... Enter passphrase for key '/home/sio/.ssh/id_ed25519':
Remarques :