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
Répondre…