Table des matières

Utiliser des certificats OpenSSH

Présentation

La connexion à distance à un serveur en SSH peut se faire avec des certificats dont le format est spécifique à OpenSSH.

Rappel

Configuration du service SSH du serveur

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

Génération du couple de clés privée / publique par le client

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

Paramètrage du compte du serveur avec votre clé publique

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" 

Gestion des serveurs connus

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"

Inconvénients de l'usage des clés publiques

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.

Génération des certificats OpenSSH

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.

Création de la clé privée sur le serveur distant avec le nom ca_key

$ ssh-keygen -f ca_key -C "SSH cle de la CA"

Cela génère 2 fichiers :

Création d'un certificat pour le client

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': 

Utilisation du certificat pour s'authentifier avec un autre compte sur le serveur distant

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.

Démarche pour se connecter sur le serveur distant avec un autre compte

$ 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 :

Création du certificat pour le serveur distant

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

Configuration du client pour pour vérifier le certificat du serveur

Rappel

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.

Préparation du cilent

echo > ~/.ssh/known_hosts
$ scp sio@adresseIPCA:/home/sio/ca_key.pub ~/.ssh/ 

Configuration du client

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

Les tests

$ 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 :