Créer un certificat SSL / TLS sur Debian
Créer un certificat SSL est une étape cruciale de la mise en place d'une connexion chiffrée. Que ce soit pour mettre en place le protocole HTTPS, pour chiffrer votre serveur IMAP, ou votre serveur FTP, ce guide vous aide à générer un certificat SSL valide.
Ce guide est testé sur:
- Debian 5.0 Squeeze
- Debian 6.0 Lenny
Pré-requis
Ce guide nécessite l'installation du paquet openssl:
command apt-get install openssl ssl-cert
Ce guide recommande la mise en place de notifications d'expiration des certificats SSL/TLS, comme proposé dans le guide Mettre en place une notification par email de l'expiration des certificats SSL / TLS.
Créez les dossiers destinés à contenir le certificat:
command mkdir --parent '/etc/ssl/private'
command mkdir --parent '/etc/ssl/requests'
command mkdir --parent '/etc/ssl/roots'
command mkdir --parent '/etc/ssl/chains'
command mkdir --parent '/etc/ssl/certificates'
Assurez-vous que le groupe système "ssl-cert" existe:
command addgroup --system 'ssl-cert'
Modifiez les permissions du dossier destiné à contenir les clefs SSL privées:
command chown -R root:ssl-cert '/etc/ssl/private'
command chmod 710 '/etc/ssl/private'
command chmod 440 '/etc/ssl/private/'*
Création d'un certificat SSL / TLS pour réseau local
Paramètres
Renseignez le nom de domaine complet (y compris le sous-domaine) pour lequel vous générez un certificat:
DOMAIN="$(command hostname --fqdn)"
Création du certificat auto-signé
Utilisez l'outil make-ssl-cert fourni par Debian pour créer un certificat auto-signé pour votre serveur local (remplacez la valeur graissée par le nom du serveur sur le réseau local):
CONF_FILE="$(command mktemp)"
command sed \
-e "s/@HostName@/${DOMAIN}/" \
-e "s|privkey.pem|/etc/ssl/private/${DOMAIN}.pem|" \
'/usr/share/ssl-cert/ssleay.cnf' > "${CONF_FILE}"
command openssl req -config "${CONF_FILE}" -new -x509 -days 3650 \
-nodes -out "/etc/ssl/certificates/${DOMAIN}.crt" -keyout "/etc/ssl/private/${DOMAIN}.key"
command rm "${CONF_FILE}"
Dans le formulaire présenté par cette commande, saisissez le nom du serveur sur le réseau local.
Cette méthode peut être utilisé pour créer un certificat SSL non valide pour un site Internet. L'utilisation de certificats auto-signé entraîne l'affichage de messages d'erreurs dans les navigateurs.
Création d'un certificat SSL / TLS pour Internet
Paramètres
Renseignez le nom de domaine complet (y compris le sous-domaine) pour lequel vous générez un certificat (gratuit avec l'autorité StartSSL):
DOMAIN="www.domain.com"
Remarque: Pour générer un certificat SSL valide pour tous les sous-domaine d'un domaine (dit certificat Wildcard), remplacez la partie destinée au sous-domaine par "*" (coût du certificat Wildcard: US $ 59.90 avec l'autorité StartSSL):
DOMAIN="*.domain.com"
Informations personnelles
Certaines informations personnelles sont nécessaires pour la création d'un certificat SSL. Chargez ces informations si elles sont déjà présentes:
if [ -e '/etc/ssl/csr-informations' ]; then
source '/etc/ssl/csr-informations'
cat '/etc/ssl/csr-informations'
else
echo "#####################
Error: No SSL informations available."
fi
Si la commande précédente affiche une erreur, ou si les informations chargées ne vous conviennent pas, mettez à jour les données:
Renseignez votre code pays (ajustez la valeur graissée):
SSL_COUNTRY="fr"
Renseignez votre région / département (ajustez la valeur graissée):
SSL_PROVINCE="Ile-de-France"
Renseignez votre ville (ajustez la valeur graissée):
SSL_CITY="Paris"
Renseignez votre adresse e-mail (ajustez la valeur graissée):
SSL_EMAIL="user@some-domain.com"
Enregistrez ces informations dans un fichier de configuration pour utilisation ultérieure:
echo "# SSL CSR informations.
SSL_COUNTRY=\"${SSL_COUNTRY}\"
SSL_PROVINCE=\"${SSL_PROVINCE}\"
SSL_CITY=\"${SSL_CITY}\"
SSL_EMAIL=\"${SSL_EMAIL}\"" \
> '/etc/ssl/csr-informations'
Création de la clef privée
Générez la clef privée RSA, d'une longueur de 2048 bits:
command openssl genrsa -out "/etc/ssl/private/${DOMAIN}.key" 2048
Protégez la clef privée:
command chown root:ssl-cert "/etc/ssl/private/${DOMAIN}.key"
command chmod 440 "/etc/ssl/private/${DOMAIN}.key"
Création de la Certificate Signing Request (CSR)
La requête de signature de certificat est l'élément envoyé à l'autorité de certification pour demander la signature (cad. la vérification) de votre certificat SSL. Il est important de ne pas faire d'erreur dans sa création, sous peine de la voir rejetée. Pour plus d'information, référez vous à l'article Wikipedia: Certificate signing request.
Préparez les informations de création de la CSR:
echo "${SSL_COUNTRY}
${SSL_PROVINCE}
${SSL_CITY}
${DOMAIN}
${DOMAIN}
${SSL_EMAIL}
" > "/tmp/${DOMAIN}.conf"
Créez la CSR:
command openssl req -new \
-key "/etc/ssl/private/${DOMAIN}.key" \
-out "/etc/ssl/requests/${DOMAIN}.csr" \
< "/tmp/${DOMAIN}.conf"
Supprimez le fichier de configuration de la CSR:
command rm "/tmp/${DOMAIN}.conf"
Affichez la CSR:
cat "/etc/ssl/requests/${DOMAIN}.csr"
Le résultat de cette commande doit ressembler à:
-----BEGIN CERTIFICATE REQUEST-----
MIIC3DCCAcQCADKZgZYOEzAJBgNVBAYAXODfRYwFAYDVQQIEw1JKJDfZGUtRnJh
..... .... ....
N4QtCKIq9ZsP+FjK+h5f7Q==
-----END CERTIFICATE REQUEST-----
Obtention de la clef publique
La clef publique est obtenue auprès d'une autorité de certification. Si vous n'avez pas de préférence, vous pouvez utiliser l'autorité de certification StartSSL.
Une fois inscrit et votre domaine validé auprès de l'autorité, demandez la validation de la CSR affiché par:
cat "/etc/ssl/requests/${DOMAIN}.csr"
Pour l'autorité de certification StartSSL, la procédure de validation se trouve dans l'onglet "Certificate Wizard" de votre compte.
Une fois la clef publique obtenue, copiez/collez la dans la variable Shell SSL_CERT (remplacez la valeur graissée par votre clef publique):
SSL_CERT="-----BEGIN CERTIFICATE-----
MIIHJzCCBg+gAwIBAgIDBNzOMXAXCDRTSIKDOWQBBQUAAGEOMMQscZfGLDVQQGEwJJ
.... .... .....
H5LYbXPAq3DpOzs=
-----END CERTIFICATE-----"
Créez le fichier de la clef publique:
echo "${SSL_CERT}" > "/etc/ssl/certificates/${DOMAIN}.crt"
Si vous avez choisi l'autorité StartSSL, téléchargez les certificats racine et intermédiaire de cette autorité:
command wget "http://www.startssl.com/certs/ca.pem" \
--output-document="/etc/ssl/roots/startssl-root.ca"
command wget "http://www.startssl.com/certs/sub.class1.server.ca.pem" \
--output-document="/etc/ssl/chains/startssl-sub.class1.server.ca.pem"
command wget "http://www.startssl.com/certs/sub.class2.server.ca.pem" \
--output-document="/etc/ssl/chains/startssl-sub.class2.server.ca.pem"
command wget "http://www.startssl.com/certs/sub.class3.server.ca.pem" \
--output-document="/etc/ssl/chains/startssl-sub.class3.server.ca.pem"
Si vous avez choisi l'autorité StartSSL, installez le certificat racine de cette autorité:
command ln -s "/etc/ssl/roots/startssl-root.ca" "/etc/ssl/roots/${DOMAIN}-root.ca"
Si vous avez choisi l'autorité StartSSL, téléchargez le certificat intermédiaire adapté à votre certificat SSL:
if [ "${DOMAIN}" = "$(echo "${DOMAIN}" | command tr '*' '.')" ]; then
command ln -s "/etc/ssl/chains/startssl-sub.class1.server.ca.pem" "/etc/ssl/chains/${DOMAIN}.ca"
else
command ln -s "/etc/ssl/chains/startssl-sub.class2.server.ca.pem" "/etc/ssl/chains/${DOMAIN}.ca"
fi
Créez un fichier regroupant les certificats publique, intermédiaire et racine pour utilisation par les applications n'ayant pas les options de configuration nécessaires:
command cp "/etc/ssl/certificates/${DOMAIN}.crt" "/etc/ssl/certificates/${DOMAIN}.crt+chain+root"
command cat "/etc/ssl/chains/${DOMAIN}.ca" >> "/etc/ssl/certificates/${DOMAIN}.crt+chain+root"
command cat "/etc/ssl/roots/${DOMAIN}-root.ca" >> "/etc/ssl/certificates/${DOMAIN}.crt+chain+root"
Le certificat est maintenant utilisable par vos serveurs HTTP, IMAP, FTP, etc... Affichez les noms de fichier des clefs le composant:
echo "Clef privée : \"/etc/ssl/private/${DOMAIN}.key\"
Certificat racine : \"/etc/ssl/roots/${DOMAIN}-root.ca\"
Certificat intermédiaire : \"/etc/ssl/chains/${DOMAIN}.ca\"
Clef publique : \"/etc/ssl/certificates/${DOMAIN}.crt\""
Autoriser l'utilisation des certificat SSL / TLS
Si le logiciel serveur démarre avec des permissions autre que "root" (c'est le cas d'Exim 4), ajoutez l'utilisateur du serveur au groupe "ssl-cert". Par exemple, pour Exim 4:
command adduser Debian-exim ssl-cert
Références
Ces livres peuvent vous aider:
Remerciements
- Merci à CACert pour leur article VhostTaskForce.
- Merci à l'auteur et aux traducteurs du howto Guide pratique des certificats SSL.
- Merci à Matthieu Vogelweith pour Serveur Web Apache - SSL - PHP.
- Merci à Documentation technique : Debian pour Création d’un Certificate Signing Request (CSR).
- Merci à Artisan Numérique pour Créer sa propre (mini) PKI.
