===================== Self-Signed SSL HOWTO (c) Nicolas Kovacs ===================== Dernière révision : 14 janvier 2017 Ce HOWTO décrit la création d'un certificat SSL auto-signé sur un serveur de réseau local Slackware Linux. * Introduction * Créer un certificat auto-signé simple * Utiliser et tester le certificat * Firefox et les certificats auto-signés * Certificats et permissions * Créer un certificat auto-signé multi-domaines * Automatiser la génération d'un certificat auto-signé Introduction ------------ Un certificat électronique peut être vu comme une carte d'identité numérique. Il est utilisé principalement pour identifier et authentifier une personne physique ou morale, et pour chiffer des échanges. Les certificats auto-signés sont des certificats à usage interne. Signé par un serveur local, ce type de certificat permet de garantir la confidentialité des échanges au sein d'une organisation, par exemple pour le besoin d'un intranet. Dans les exemples qui suivent, nous allons créer une série de certificats auto-signés pour le serveur de réseau local 'amandine.microlinux.lan'. Créer un certificat auto-signé simple ------------------------------------- Sur un système Linux, le répertoire '/etc/ssl/certs' contient les certificats du système. Les clés privées sont censées être rangées dans le répertoire '/etc/ssl/private'. Il s'agit là d'une convention, et non d'une obligation. Étant donné que '/etc/ssl/certs' contient déjà une multitude de certificats, nous allons créer un répertoire '/etc/ssl/mycerts', dans lequel nous allons ranger nos propres certificats : # mkdir /etc/ssl/mycerts La génération d'un certificat auto-signé et de la clé privée correspondante peut s'effectuer en une seule commande, comme ceci : # openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -sha256 \ -out /etc/ssl/mycerts/amandine.microlinux.lan.crt \ -keyout /etc/ssl/private/amandine.microlinux.lan.key La commande est interactive et vous somme de répondre à une série de questions. Attention, le champ "Common Name" doit correspondre EXACTEMENT à l'URL du site sécurisé : ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:Gard Locality Name (eg, city) []:Montpezat Organization Name (eg, company) [Internet Widgits Pty Ltd]:Microlinux Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:amandine.microlinux.lan Email Address []:info@microlinux.fr Voici une vue en détail des options utilisées : > 'req' initie une demande de signature de certificat (CSR ou "Certificate Signing Request") ; > '-new' génère une nouvelle demande de certificat, qui demande à l'utilisateur de saisir un certain nombre de valeurs pour les champs ; > '-x509' produit un certificat X.509 auto-signé au lieu d'une demande de signature de certificat (CSR) ; > '-days n' spécifie la durée de validité du certificat (n jours) ; > '-newkey rsa:4096' crée une nouvelle clé privée ; > 'sha256' spécifie l'algorithme pour la signature ; > '-nodes' indique que la clé privée ne doit pas être encryptée ; > '-out fichier.crt' spécifie le fichier dans lequel sera écrit le certificat ; > '-keyout fichier.key' définit l'emplacement de la clé. Sécuriser la clé privée : # chmod 0600 /etc/ssl/private/amandine.microlinux.lan.key Créer un lien symbolique vers /etc/ssl/certs : # cd /etc/ssl/certs # ln -s ../mycerts/amandine.microlinux.lan.crt . Utiliser et tester le certificat -------------------------------- Pour commencer, on peut mettre en place un hébergement web sécurisé. Voici la stance correspondante dans la configuration d'Apache : --8<---------- /etc/httpd/extra/httpd-ssl.conf ------------------------------- ... DocumentRoot "/srv/httpd/vhosts/default/htdocs" ServerName amandine.microlinux.lan:443 ServerAdmin info@microlinux.lan ErrorLog "/var/log/httpd/default-error_log" TransferLog "/var/log/httpd/default-access_log" SSLEngine on SSLCertificateFile "/etc/ssl/mycerts/amandine.microlinux.lan.crt" SSLCertificateKeyFile "/etc/ssl/private/amandine.microlinux.lan.key" SSLCertificateChainFile "/etc/ssl/mycerts/amandine.microlinux.lan.crt" ... --8<-------------------------------------------------------------------------- La procédure détaillée fait l'objet d'un HOWTO à part : * Apache-SSL-HOWTO Firefox et les certificats auto-signés -------------------------------------- Dans sa configuration par défaut, Firefox refuse d'afficher les pages sécurisées avec un certificat auto-signé. L'utilisateur se retrouve confronté au message d'erreur "La connexion n'est pas sécurisée". Un clic sur "Avancé" affiche les détails : ************************************************************* amandine.microlinux.lan uses an invalid security certificate. The certificate is not trusted because it is self-signed. Error code: SEC_ERROR_UNKNOWN_ISSUER ************************************************************* Pour afficher le site, il faut cliquer sur "Ajouter une exception...", puis "Confirmer l'exception de sécurité" dans la fenêtre subséquente. /!\ Malheureusement, cela ne sert à rien d'exporter le certficat vers les postes clients du réseau local. Firefox n'en tiendra pas compte, étant donné qu'il utilise sa propre collection de certificats codée "en dur". Certificats et permissions -------------------------- Si l'on souhaite utiliser plusieurs applications sécurisées pour un même domaine (Web, messagerie XMPP), on se retrouve confronté à un problème de permissions. Concrètement, si le serveur Web ainsi que le serveur de messagerie Prosody doivent accéder en lecture au certificat et à la clé privée, on peut utiliser la solution qui suit. On crée un groupe système 'certs', on ajoute les utilisateurs système respectifs à ce groupe et on règle les permissions des fichiers en fonction, c'est-à-dire root:certs. Concrètement : # groupadd -g 240 certs # chown root:certs /etc/ssl/mycerts/amandine.microlinux.lan.crt # chmod 0640 /etc/ssl/mycerts/amandine.microlinux.lan.crt # chown root:certs /etc/ssl/private/amandine.microlinux.lan.key # chmod 0640 /etc/ssl/private/amandine.microlinux.lan.key Si l'on souhaite qu'une application accède au certificat et à la clé privée, il suffit qu'on ajoute l'utilisateur correspondant au groupe système 'certs'. Exemple pour la messagerie XMPP Prosody : # usermod -a -G certs prosody Créer un certificat auto-signé multi-domaines --------------------------------------------- Un certificat multi-domaines sera valable pour plusieurs domaines. Pour notre serveur 'amandine.microlinux.lan', on aura ceci par exemple : * amandine.microlinux.lan * slackware.amandine.microlinux.lan (documentation de Slackware) * freebsd.amandine.microlinux.lan (documentation de FreeBSD) La génération d'un tel certificat est un tout petit peu plus compliquée. Pour commencer, créer et éditer le fichier de configuration suivant : --8<---------- /etc/ssl/mycerts/amandine.microlinux.lan.cnf ------------------ [req] distinguished_name = req_distinguished_name string_mask = nombstr req_extensions = v3_req [req_distinguished_name] organizationName = Organization Name (company) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name stateOrProvinceName = State or Province Name countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name commonName_max = 64 organizationName_default = Microlinux emailAddress_default = info@microlinux.fr localityName_default = Montpezat stateOrProvinceName_default = Gard countryName_default = FR commonName_default = amandine.microlinux.lan [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = amandine.microlinux.lan DNS.2 = slackware.amandine.microlinux.lan DNS.3 = freebsd.amandine.microlinux.lan --8<-------------------------------------------------------------------------- Générer la clé privée : # openssl genrsa -out /etc/ssl/private/amandine.microlinux.lan.key 4096 Sécuriser cette clé : # chmod 0600 /etc/ssl/private/amandine.microlinux.lan.key Générer une demande de signature de certificat (CSR) : # openssl req -new -sha256 \ -out /etc/ssl/mycerts/amandine.microlinux.lan.csr \ -key /etc/ssl/private/amandine.microlinux.lan.key \ -config /etc/ssl/mycerts/amandine.microlinux.lan.cnf Si l'on a correctement édité le fichier de configuration, il suffira de confirmer les valeurs par défaut dans le dialogue qui s'ensuit. ----- Organization Name (company) [Microlinux]: Email Address [info@microlinux.fr]: Locality Name [Montpezat]: Country Name (2 letter code) [FR]: Common Name [amandine.microlinux.lan]: Signer et générer le certificat : # openssl x509 -req -sha256 -days 3650 \ -in /etc/ssl/mycerts/amandine.microlinux.lan.csr \ -signkey /etc/ssl/private/amandine.microlinux.lan.key \ -out /etc/ssl/mycerts/amandine.microlinux.lan.crt \ -extensions v3_req \ -extfile /etc/ssl/mycerts/amandine.microlinux.lan.cnf Là aussi, c'est une bonne idée de créer un lien symbolique dans '/etc/ssl/certs' : # cd /etc/ssl/certs # ln -s ../mycerts/amandine.microlinux.lan.crt . Éventuellement, on pourra modifier les permissions comme ceci : # chown root:certs /etc/ssl/mycerts/amandine.microlinux.lan.crt # chmod 0640 /etc/ssl/mycerts/amandine.microlinux.lan.crt # chown root:certs /etc/ssl/private/amandine.microlinux.lan.key # chmod 0640 /etc/ssl/private/amandine.microlinux.lan.key Automatiser la génération d'un certificat auto-signé ---------------------------------------------------- Comme nous venons de le voir, la génération d'un certificat auto-signé valable pour plusieurs domaines est une procédure passablement fastidieuse. Pour nous éviter d'avoir à éditer un fichier de configuration à rallonge et saisir des commandes avec des options à n'en plus finir, nous allons tout simplement scripter la procédure. Un exemple de script se trouve dans mon dépôt Github, à l'adresse suivante : # git clone https://github.com/kikinovak/microlinux Le répertoire 'template/self-signed-ssl/' fournit le script 'mkcert-lan.sh'. Pour l'utiliser, la meilleure solution consiste à le copier en un endroit approprié, comme par exemple '/usr/local/sbin'. Éditer le script en fonction de ses besoins, avant de le lancer en tant que root. ------------------------------------------------------------------------------ # vim: syntax=txt