Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / HTTP / Créer un certificat SSL / TLS sur Debian

Créer un certificat SSL / TLS sur Debian

Par Pierre-Yves Landuré Dernière modification 14/11/2017 14:39

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 Lenny
  • Debian 6.0 Squeeze
  • Debian 7.0 Wheezy

Pré-requis

Ce guide recommande:

Préparation de l'environnement

Installez les logiciels nécessaires:

command apt-get install openssl ssl-cert

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'
command mkdir --parent '/etc/ssl/authorities'
command mkdir --parent '/etc/ssl/configs'

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 auto-signé (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:

SSL_KEY_NAME="$(command hostname --fqdn)"

Création d'un certificat auto-signé

Créez un certificat SSL auto-signé:

CONF_FILE="$(command mktemp)"
command sed \
-e "s/@HostName@/${SSL_KEY_NAME}/" \
-e "s|privkey.pem|/etc/ssl/private/${SSL_KEY_NAME}.key|" \
'/usr/share/ssl-cert/ssleay.cnf' > "${CONF_FILE}"
command openssl req -config "${CONF_FILE}" -new -x509 -days 3650 \
-nodes -out "/etc/ssl/certificates/${SSL_KEY_NAME}.crt" -keyout "/etc/ssl/private/${SSL_KEY_NAME}.key"
command rm "${CONF_FILE}"

Protégez la clef privée:

command chown root:ssl-cert "/etc/ssl/private/${SSL_KEY_NAME}.key"
command chmod 440 "/etc/ssl/private/${SSL_KEY_NAME}.key"

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.

Remarque: Debian fourni un outil pour créer des certificats auto-signés, mais il ne permet pas de séparer la clef privée de la clef publique :

# command make-ssl-cert '/usr/share/ssl-cert/ssleay.cnf' '/etc/ssl/certificates/${SSL_KEY_NAME}.crt'

Création d'un certificat SSL / TLS valide (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):

SSL_KEY_NAME="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):

SSL_KEY_NAME="*.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/${SSL_KEY_NAME}.key" 2048

Protégez la clef privée:

command chown root:ssl-cert "/etc/ssl/private/${SSL_KEY_NAME}.key"
command chmod 440 "/etc/ssl/private/${SSL_KEY_NAME}.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.

Créez la CSR:

command openssl req -new \
-key "/etc/ssl/private/${SSL_KEY_NAME}.key" \
-out "/etc/ssl/requests/${SSL_KEY_NAME}.csr" \
<<< "${SSL_COUNTRY}
${SSL_PROVINCE}
${SSL_CITY}
${SSL_KEY_NAME}

${SSL_KEY_NAME}
${SSL_EMAIL}

"

Affichez la CSR:

cat "/etc/ssl/requests/${SSL_KEY_NAME}.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/${SSL_KEY_NAME}.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/${SSL_KEY_NAME}.crt"

Si vous avez choisi l'autorité StartSSL, téléchargez les certificats racine et intermédiaire de cette autorité:

command wget "https://www.startssl.com/certs/ca.crt" \
--output-document="/etc/ssl/roots/startssl-root.ca"
command wget "https://www.startssl.com/certs/sca.server1.crt" \
--output-document="/etc/ssl/chains/startssl-sub.class1.server.ca.pem"
command wget "https://www.startssl.com/certs/sca.server2.crt" \
--output-document="/etc/ssl/chains/startssl-sub.class2.server.ca.pem"
command wget "https://www.startssl.com/certs/sca.server3.crt" \
--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/${SSL_KEY_NAME}-root.ca"

Si vous avez choisi l'autorité StartSSL, téléchargez le certificat intermédiaire adapté à votre certificat SSL:

if [ "${SSL_KEY_NAME}" = "$(echo "${SSL_KEY_NAME}" | command tr '*' '.')" ]; then
command ln -s "/etc/ssl/chains/startssl-sub.class1.server.ca.pem" "/etc/ssl/chains/${SSL_KEY_NAME}.ca"
else
command ln -s "/etc/ssl/chains/startssl-sub.class2.server.ca.pem" "/etc/ssl/chains/${SSL_KEY_NAME}.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/${SSL_KEY_NAME}.crt" "/etc/ssl/certificates/${SSL_KEY_NAME}.crt+chain+root"
test -e "/etc/ssl/chains/${SSL_KEY_NAME}.ca" \
&& command cat "/etc/ssl/chains/${SSL_KEY_NAME}.ca" >> "/etc/ssl/certificates/${SSL_KEY_NAME}.crt+chain+root"
test -e "/etc/ssl/roots/${SSL_KEY_NAME}-root.ca" \
&& command cat "/etc/ssl/roots/${SSL_KEY_NAME}-root.ca" >> "/etc/ssl/certificates/${SSL_KEY_NAME}.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/${SSL_KEY_NAME}.key\"
Certificat racine : \"/etc/ssl/roots/${SSL_KEY_NAME}-root.ca\"
Certificat intermédiaire : \"/etc/ssl/chains/${SSL_KEY_NAME}.ca\"
Clef publique : \"/etc/ssl/certificates/${SSL_KEY_NAME}.crt\""

Création d'une autorité de certification locale

Paramètres

Renseignez le nom de domaine complet (y compris le sous-domaine) pour lequel vous générez un certificat:

SSL_CA_NAME="$(command hostname --fqdn)"

Création d'une autorité de certification

Créez le fichier de configuration de l'autorité:

command mkdir --parent "/etc/ssl/authorities/${SSL_CA_NAME}"
CONF_FILE="/etc/ssl/authorities/${SSL_CA_NAME}/${SSL_CA_NAME}.conf"
command sed \
-e "s/@HostName@/${SSL_CA_NAME}/" \
-e "s|privkey.pem|/etc/ssl/private/${SSL_CA_NAME}.cakey|" \
'/usr/share/ssl-cert/ssleay.cnf' > "${CONF_FILE}"
command echo "[ ca ]
default_ca = CA_${SSL_CA_NAME}
[ CA_${SSL_CA_NAME} ]
dir = /etc/ssl
serial = \$dir/authorities/${SSL_CA_NAME}/serial
database = \$dir/authorities/${SSL_CA_NAME}/index.txt
new_certs_dir = \$dir/certificates
certificate = \$dir/authorities/${SSL_CA_NAME}.ca
private_key = \$dir/private/${SSL_CA_NAME}.cakey
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_anything
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash" \
>> "${CONF_FILE}"

Créez l'autorité de certification locale:

command openssl req -config "${CONF_FILE}" -new -x509 -extensions v3_ca -days 3650 \
-nodes -out "/etc/ssl/authorities/${SSL_CA_NAME}.ca" -keyout "/etc/ssl/private/${SSL_CA_NAME}.cakey"

Protégez la clef privée:

command chown root:ssl-cert "/etc/ssl/private/${SSL_CA_NAME}.cakey"
command chmod 440 "/etc/ssl/private/${SSL_CA_NAME}.cakey"

Créez les fichiers nécessaires:

command touch "/etc/ssl/authorities/${SSL_CA_NAME}/index.txt"
command echo '01' > "/etc/ssl/authorities/${SSL_CA_NAME}/serial"

Cette autorité est utilisée pour signer les certificats générés localement. Elle n'a pratiquement aucune valeur, sinon de permettre la validation de certificats locaux signés par cette autorité par des clients ayant installé sa clef publique.

Obtention de la clef publique d'un certificat via validation de la CSR

Remarque: La procédure de création d'une CSR est détaillée plus haut dans ce guide.

Signez un certificat publique en acceptant la CSR avec l'autorité locale:

echo 'y
y' > '/tmp/ca.input'
CONF_FILE="/etc/ssl/authorities/${SSL_CA_NAME}/${SSL_CA_NAME}.conf"
command openssl ca -config "${CONF_FILE}" -days 3650 \
-out "/etc/ssl/certificates/${SSL_KEY_NAME}.crt" \
-in "/etc/ssl/requests/${SSL_KEY_NAME}.csr" \
< '/tmp/ca.input'
command rm '/tmp/ca.input'

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

Benjamin Benito a écrit :
15/03/2017 21:41
Bonjour je regarde votre tuto pour un projet server mais une chose m' échappe totalement .
dans le script :
"CONF_FILE="$(command mktemp)"
command sed \
    -e "s/@HostName@/${SSL_KEY_NAME}/" \
    -e "s|privkey.pem|/etc/ssl/private/${SSL_KEY_NAME}.key|" \
    '/usr/share/ssl-cert/ssleay.cnf' > "${CONF_FILE}"
command openssl req -config "${CONF_FILE}" -new -x509 -days 3650 \
    -nodes -out "/etc/ssl/certificates/${SSL_KEY_NAME}.crt" -keyout "/etc/ssl/private/${SSL_KEY_NAME}.key"
command rm "${CONF_FILE}" "

Sous debian 8 j'ai une erreur pour l'expression :
sed: -e option inconnue pour 's'

Que représente s dans votre code?

Merci de votre réponse
Ajouter un commentaire

Vous pouvez ajouter un commentaire en complétant le formulaire ci-dessous. Le format doit être plain text. Les url et les courriels sont transformés en liens cliquables. Les commentaires sont modérés.