Vérifier le client du dépôt avec des certificats
Dans Exécuter Docker avec HTTPS, vous avez appris que, par défaut, Docker s'exécute via un socket Unix non-réseau et TLS doit être activé pour que le client Docker et le démon communiquent de manière sécurisée via HTTPS. TLS garantit l'authenticité du point de terminaison du registre et que le trafic vers/depuis le registre est chiffré.
Cet article démontre comment s'assurer que le trafic entre le serveur de registre Docker et le démon Docker (un client du serveur de registre) est chiffré et correctement authentifié en utilisant l'authentification client-serveur basée sur des certificats.
Nous vous montrons comment installer un certificat racine d'Autorité de Certification (CA) pour le registre et comment définir le certificat TLS client pour la vérification.
Comprendre la configuration
Un certificat personnalisé est configuré en créant un répertoire sous
/etc/docker/certs.d
en utilisant le même nom que le nom d'hôte du registre, tel que
localhost
. Tous les fichiers *.crt
sont ajoutés à ce répertoire en tant que racines CA.
NoteSur Linux, toutes les autorités de certificats racines sont fusionnées avec les paramètres par défaut du système, y compris l'ensemble de CA racines de l'hôte. Si vous exécutez Docker sur Windows Server, ou Docker Desktop pour Windows avec des conteneurs Windows, les certificats par défaut du système ne sont utilisés que lorsqu'aucun certificat racine personnalisé n'est configuré.
La présence d'une ou plusieurs paires <nom_fichier>.key/cert
indique à Docker
qu'il y a des certificats personnalisés requis pour l'accès au
dépôt souhaité.
NoteSi plusieurs certificats existent, chacun est essayé dans l'ordre alphabétique. S'il y a une erreur d'authentification de niveau 4xx ou 5xx, Docker continue à essayer avec le certificat suivant.
Ce qui suit illustre une configuration avec des certificats personnalisés :
/etc/docker/certs.d/ <-- Répertoire des certificats
└── localhost:5000 <-- Nom d'hôte:port
├── client.cert <-- Certificat client
├── client.key <-- Clé client
└── ca.crt <-- CA racine qui a signé
le certificat du registre, en PEM
L'exemple précédent est spécifique au système d'exploitation et est à des fins d'illustration uniquement. Vous devriez consulter la documentation de votre système d'exploitation pour créer une chaîne de certificats groupés fournie par l'OS.
Créer les certificats clients
Utilisez les commandes genrsa
et req
d'OpenSSL pour d'abord générer une
clé RSA puis utiliser la clé pour créer le certificat.
$ openssl genrsa -out client.key 4096
$ openssl req -new -x509 -text -key client.key -out client.cert
NoteCes commandes TLS ne génèrent qu'un ensemble de certificats fonctionnel sur Linux. La version d'OpenSSL dans macOS est incompatible avec le type de certificat que Docker requiert.
Conseils de dépannage
Le démon Docker interprète les fichiers .crt
comme des certificats CA et les fichiers .cert
comme des certificats clients. Si un certificat CA reçoit accidentellement l'extension
.cert
au lieu de l'extension correcte .crt
, le démon Docker enregistre le
message d'erreur suivant :
Missing key KEY_NAME for client certificate CERT_NAME. CA certificates should use the extension .crt.
Si le registre Docker est accédé sans numéro de port, n'ajoutez pas le port au nom du répertoire. Ce qui suit montre la configuration pour un registre sur le port par défaut 443 qui est accédé avec docker login my-https.registry.example.com
:
/etc/docker/certs.d/
└── my-https.registry.example.com <-- Nom d'hôte sans port
├── client.cert
├── client.key
└── ca.crt