Table des matières

Configurer une authentification SSH avec certificat

Resources

Principes

L'utilisation de certificats permet de garantir l'identité du client et du serveur.

Le certificat présent par le client ou le serveur est signé par la clé privée d'une authorité de certification reconnue.

Les éléments nécessaires

Format d’un clé publique ssh

Une clé publique SSH est une chaîne de texte en une seule ligne, avec plusieurs parties distinctes : <type> <clé encodée en base64> <commentaire facultatif>

Type : Spécifie l'algorithme utilisé pour générer la clé. Par exemple :

Clé encodée en base64 : chaîne encodée en Base64 représentant la clé publique.

Commentaire facultatif : information pour identifier la clé : nom d'utilisateur et l'hôte depuis lequel la clé a été générée.

Mise en place côté serveur

TrustedUserCAKeys /etc/ssh/ca.pub

IMPORTANT : le certificat du client ne sera considéré que si sa liste de nom-clés (principal) contient le nom du compte auquel il tente de se connecter.

SAUF si un fichier spécifique à chaque compte indique la liste des noms-clés acceptés. Directive AuthorizedPrincipalsFile dans sshd_config

Mise en place côté client

Le client doit faire signer sa clé publique pour obtenir un certificat qui doit être placé dans le même répertoire que sa clé privé et publique.

cp client_key ~/.ssh/
cp client_cert.pub ~/.ssh/

Les permissions doivent être correctes :

chmod 600 ~/.ssh/client_key
chmod 644 ~/.ssh/client_cert.pub

Lors d’une connexion avec la clé privée, le certificat sera automatiquement présenté au serveur.

Le client ssh doit seulement indique quelle clé privée utiliser avec l’option -i

ssh -i ~/.ssh/client_key nomDNSserveur

Ainsi même s’il n’y a pas de clé publique client dans authorized_keys, l’authentification se fait. L’option -v permet de voir l’utilisation du certificat

ssh -v -i ~/.ssh/client_key nomDNSserveur

Vous pouvez utiliser aussi le fichier de configuraito du client ssh

Host <nom_du_serveur> 
    HostName <adresse_du_serveur> 
    User <nom_utilisateur>
    IdentityFile ~/.ssh/client_key
    CertificateFile ~/.ssh/client_cert.pub

Les commandes utiles

$ ssh-keygen -y -f utilisateur-identite.pem > id_rsa.pub
$ openssl x509 -in charles-cert.pem -pubkey –noout > id_rsa.pem

noout permet d’avoir uniquement la clé publique sans le certificat

$ ssh-keygen -i -m PKCS8 -f id_rsa.pem > id_rsa.pub
$ openssl x509 -in pkicub-cert.pem -pubkey –noout > ca.pem
* Convertir la clé publique du format PEM au format openssh 
$ ssh-keygen -f ca.pem > ca.pub
journalctl -u ssh
ssh -v <nom_du_serveur>
echo "@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQE..." >> ~/.ssh/known_hosts

Cela permet au client de faire confiance à tous les serveurs avec des certificats signés par cette CA.

openssl x509 -in filename.pem -text –noout

-noout pour ne pas afficher en base64 qui permet d’encode des données binaires ASCII

openssl x509 -in filename.pem -issuer –noout
openssl x509 -in filename.pem -subject –noout
openssl x509 -in filename.pem -fingerprint –noout
openssl x509 -in filename.pem –pubkey -noout –out id_rsa.pub