Objectif wrote:Ce tutoriel a pour but de simplifier l'authentification à une application nginx en utilisant un certificat côté client.
Attention : Cette méthode n'a pas été testée avec rutorrent qui utilise le .htpasswd pour sélectionner l'utilisateur. Je n'ai pas encore eu le temps de faire des tests ou d'en vérifier la compatibilité.
Crédits
Tout ce qui suit est inspiré de
ce tutoriel. Mon objectif est avant tout de fournir une version française pour les moins anglophonnes d'entre-nous et d'apporter quelques corrections au tutoriel d'origine.
Prérequis
- avoir installé Openssl
- avoir installé nginx
- savoir éditer un fichier dans un terminal (vim/nano)
1ère étape : Configuration de Openssl
Nous devons d'abord configurer Openssl.
Editez le fichier :
/usr/lib/ssl/openssl.cnf
Cherchez et modifiez les lignes suivantes : (on facilite la création de certificats utilisateur)
countryName_default = FR
stateOrProvinceName_default = France
0.organizationName_default = monserveur
en remplaçant "
monserveur" par le nom de votre serveur.
Puis ajoutez à la fin du fichier les lignes suivantes : (on configure notre CA : Certification Authority)
#######################################################
[ nginx-auth ]
dir = /etc/ssl/nginx-auth # Dossier ou tout est sauvegardé
certs = $dir/certs # Dossier contenant les certificats
crl_dir = $dir/crl
database = $dir/index.txt # index de la base de donnée
#unique_subject = no
new_certs_dir = $dir/newcerts # Dossier des nouveaux certificats
certificate = $dir/cacert.pem # Le certificat CA
serial = $dir/serial # Numéro de série actuel
#crlnumber = $dir/crlnumber
#crl = $dir/crl.pem
private_key = $dir/private/cakey.pem # La clé privée
RANDFILE = $dir/private/.rand # Numéro aléatoire privé
x509_extensions = usr_cert # Extensions à ajouter
name_opt = ca_default
cert_opt = ca_default
default_days = 365 # Durée de validité pour les certificats
default_crl_days= 30
default_md = sha1
preserve = no
policy = policy_match
2ème étape : Création des scripts
Nous allons créer les scripts pour gérer nos utilisateurs.
Par cohérence avec le reste du forum et par préférence personnelle, je crée mes scripts dans "/usr/share/scripts-perso/" :
cd /usr/share/scripts-perso/
-
new_ca.sh
#!/bin/bash
function usage () {
echo "$0 [CA section name]"
exit 1
}
if [ $# -ne 1 ]
then
usage
fi
CA_NAME="$1"
SSL_DIR="/etc/ssl"
SSL_PRIVATE_DIR="$SSL_DIR/${CA_NAME}/private"
SSL_CERTS_DIR="$SSL_DIR/${CA_NAME}/certs"
mkdir -p ${SSL_PRIVATE_DIR}
mkdir -p ${SSL_CERTS_DIR}
touch $SSL_DIR/${CA_NAME}/index.txt
touch $SSL_DIR/${CA_NAME}/crlnumber
# Create the CA Key and Certificate for signing Client Certs (good for 3 yrs)
openssl genrsa -des3 -out $SSL_PRIVATE_DIR/ca.key 4096
openssl req -new -x509 -days 1095 -key $SSL_PRIVATE_DIR/ca.key -out $SSL_CERTS_DIR/ca.crt
# Create a Certificate Revocation list for removing 'user certificates.'
openssl ca -name ${CA_NAME} -gencrl -keyfile $SSL_PRIVATE_DIR/ca.key -cert $SSL_CERTS_DIR/ca.crt -out $SSL_PRIVATE_DIR/ca.crl -crldays 1095
Ce script simplifie la création de la CA, comme on peut le voir, on a ici limité la validité à 3 ans.
-
new_client.sh
#!/bin/bash
function usage () {
echo "$0 [CA section name] [username]"
exit 1
}
if [ $# -ne 2 ]
then
usage
fi
CA_NAME="$1"
USERNAME="$2"
SSL_DIR="/etc/ssl"
SSL_PRIVATE_DIR="$SSL_DIR/${CA_NAME}/private"
SSL_CERTS_DIR="$SSL_DIR/${CA_NAME}/certs"
USERS_DIR="${SSL_CERTS_DIR}/users"
mkdir -p ${USERS_DIR}
# Create the Client Key and CSR
openssl genrsa -des3 -out ${USERS_DIR}/${USERNAME}.key 1024
openssl req -new -key ${USERS_DIR}/${USERNAME}.key -out ${USERS_DIR}/${USERNAME}.csr
# Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do.
openssl x509 -req -days 1095 -in ${USERS_DIR}/${USERNAME}.csr -CA $SSL_CERTS_DIR/ca.crt -CAkey $SSL_PRIVATE_DIR/ca.key -CAserial $SSL_DIR/${CA_NAME}/serial -CAcreateserial -out ${USERS_DIR}/${USERNAME}.crt
echo "making p12 file"
#browsers need P12s (contain key and cert)
openssl pkcs12 -export -clcerts -in ${USERS_DIR}/${USERNAME}.crt -inkey ${USERS_DIR}/${USERNAME}.key -out ${USERS_DIR}/${USERNAME}.p12
echo "made ${USERS_DIR}/${USERNAME}.p12"
Ce script facilite la création d'un fichier ".p12" qui contiendra le certificat à fournir à l'utilisateur.
-
revoke_user.sh
#!/bin/bash
function usage () {
echo "$0 [CA section name] [username]"
exit 1
}
if [ $# -ne 2 ]
then
usage
fi
CA_NAME="$1"
USERNAME="$2"
SSL_DIR="/etc/ssl"
SSL_PRIVATE_DIR="$SSL_DIR/${CA_NAME}/private"
SSL_CERTS_DIR="$SSL_DIR/${CA_NAME}/certs"
USERS_DIR="${SSL_CERTS_DIR}/users"
# Revoke a particular user's certificate.
openssl ca -name ${CA_NAME} -revoke ${USERS_DIR}/${USERNAME}.crt -keyfile $SSL_PRIVATE_DIR/ca.key -cert $SSL_CERTS_DIR/ca.crt
# Update the Certificate Revocation list for removing 'user certificates.'
openssl ca -name ${CA_NAME} -gencrl -keyfile $SSL_PRIVATE_DIR/ca.key -cert $SSL_CERTS_DIR/ca.crt -out $SSL_PRIVATE_DIR/ca.crl -crldays 1095
Ce script permet de faire la révocation d'un certificat client.
On rend les scripts éxécutables :
chmod u+x *.sh
3ème étape : Création de la CA
On lance la commande :
./new_ca.sh nginx-auth
Notez bien
précieusement le mot de passe que vous entrez à l'étape :
Enter pass phrase for /etc/ssl/nginx-auth/private/ca.key:
car il vous sera demandé de multiples fois par la suite, pour la création et la suppression d'utilisateurs.
Les autres champs étants pré-remplis dans la 1ère étape, il suffit d'appuyer sur Entrée
4ème étape : Création d'un certificat utilisateur
Cette étape est à répéter autant de fois qu'il y a d'utilisateur à authentifier sur l'application que l'on souhaite protéger.
Il faudra remplacer "
monuser" par le nom d'utilisateur.
./new_client.sh nginx-auth monuser
Attention : il faut remplir les étapes (ces informations sont suceptibles d'êtres utilisées par l'application)
Common Name (e.g. server FQDN or YOUR name) []: monuser
Email Address []: monuser@domaine.tld
("
monuser@domaine.tld" est bien entendu à remplacer par l'email de l'utilisateur)
Le mot de passe que l'on peut renseigner à l'étape "
Export Password" sert à protéger le certificat ".p12" lors de l'ajout dans le naviguateur web (en cas de transfert depuis le serveur de ce fichier dans un environnement peu sûr).
5ème étape : Configuration de nginx
Nous allons maintenant éditer le fichier de configuration nginx correspondant à notre application.
Pour cela allons dans le dossier :
cd /etc/nginx/sites-enabled
- Si vous avez déjà une application avec un certificat ssl, alors il vous suffit de rajouter ces lignes en dessous de "ssl_certificate_key" :
ssl_client_certificate /etc/ssl/testconfg/certs/ca.crt;
ssl_crl /etc/ssl/testconfg/private/ca.crl;
ssl_verify_client on;
- Sinon je vous invite à suivre le très bon
tutoriel de Jedediah sur Let's Encrypt puis faire l'ajoute juste au dessus.
N'oubliez pas de redémarrer ensuite nginx pour prendre en compte les modifications :
service nginx restart
6ème étape : Test !
Lorsque vous accédez à votre application sans certificat cela-donne :

(l'affichage est semblable si le certificat est invalide).
Nous allons donc ajouter le certificat utilisateur au format ".p12" à notre naviguateur web :
Pour cela, sur chrome (probablement analogue sous Firefox), allez dans :
Paramètres >
HTTPS/SSL
Puis
Puis cliquez sur "
Importer" et entrez le mot de passe d'export si vous en avez mit un.
Félicitations ! Vous pouvez désormais accéder à votre application sans taper de mot de passe !
7ème étape : Révocation d'un utilisateur
Voici la procédure pour révoquer l'accès à un utilisateur.
Lancez la commande :
./revoke_user.sh nginx-auth monuser
Puis supprimmez les fichiers correspondants :
rm /etc/ssl/nginx-auth/certs/users/monuser.*
et relancez nginx :
service nginx restart
Merci d'avoir suivit ce tutoriel !
Pour toute question ou remarque, merci d'aller poster ici :
https://mondedie.fr/d/7986/1