Mise en place d'un CA avec easyrsa
(Page publique)
Création d'un CA avec easy-rsa
# Installation de easy-rsa: apt-get install easy-rsa # It is either in its own easy-rsa package of packaged with openvpn # Create basic file structure: cd /srv make-cadir ca-openvpn cd ca-openvpn
# Configure: vim ./vars # Voir fichier ci dessous: # Generate CA: . ./vars ./clean-all KEY_CN="ca" KEY_NAME="OpenVPN CA" KEY_EMAIL="openvpn@example.com" ./pkitool --initca
Fichier vars (voir le fichier origin pour les commentaires) :
# You do not need to touch all this: export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" # Key material parameters: export KEY_SIZE=2048 # Expiration parameters: export CA_EXPIRE=3650 export KEY_EXPIRE=3650 # Distinguished name fields for X.509 certificates: export KEY_COUNTRY="FR" export KEY_PROVINCE="Lorraine" export KEY_CITY="Nancy" export KEY_ORG="Lorraine Data Network" export KEY_OU="OpenVPN"
Utilisation :
cd /srv/ca-openvpn # Generate server keypair+certificate: KEY_CN="openvpn.example.com" KEY_NAME="Serveur OpenVPN" KEY_EMAIL="openvpn@example.com" ./pkitool --server openvpn.example.com # Generate client keypair+certificate: KEY_CN="john" KEY_NAME="John Machin" KEY_EMAIL="john.machin@example.com" ./pkitool john
Commandes ARN (variables pas définies dans le fichier vars?) :
# AC KEY_COUNTRY="FR" KEY_PROVINCE="Alsace" KEY_CITY="Strasbourg" KEY_ORG="Alsace Reseau Neutre" KEY_OU="" KEY_CN="ac" KEY_NAME="AC VPN" KEY_EMAIL="example@example.com" ./pkitool --initca # Serveur KEY_COUNTRY="FR" KEY_PROVINCE="Alsace" KEY_CITY="Strasbourg" KEY_ORG="Alsace Reseau Neutre" KEY_OU="" KEY_CN="vpn.arn-fai.net" KEY_NAME="Serveur vpn0" KEY_EMAIL="example@example.com" ./pkitool --server vpn.arn-fai.net # Utilisateur KEY_COUNTRY="FR" KEY_PROVINCE="Alsace" KEY_CITY="Strasbourg" KEY_ORG="Alsace Reseau Neutre" KEY_OU="" KEY_CN="jmachin" KEY_NAME="John Machin" KEY_EMAIL="example@example.com" ./pkitool jmachin
Générer une liste de révocation vide
On aura besoin de révoquer les certificats des utilisateurs pour plusieurs raisons :
- Clé privée compromise
- Membre ne souhaitant plus être abonné au service VPN
- Mot de passe de la clé privée oubliée par le membre
Pour se faire, on utilise une liste de révocation des certificats (CRL) : il s'agit d'un fichier (signée par le CA) qui liste tous les certificats (émis par le CA) révoqués. Ce fichier est consulté par le serveur OpenVPN : si le certificat utilisé par le client est dans cette liste, la connection est refusée.
Visiblement, il n'y a pas de commande prévue dans easy-rsa pour générer une CRL sans révoquer un certificat. On va passer par OpenSSL directement:
KEY_NAME=dummy KEY_CN=dummy KEY_EMAIL=example@foobar.com openssl ca -config $KEY_CONFIG -gencrl -out keys/crl.pem
Ne pas oublier de copier le fichier générer là où OpenVPN va le chercher (si besoin).
Révocation d'un certificat
Si la clé privée de l'utilisateur toto a été compromise ou perdue, il faut révoquer le certificat correspondant :
Révoquer le certificat de l'utilisateur toto :
cd /etc/openvpn/easy-rsa . ./vars ./revoke-full toto
Ne pas oublier de copier le fichier générer là où OpenVPN va le chercher (si besoin).
Il faut ensuite lui générer un nouveau certificat.
Si un utilisateur n'utilise plus le service, il n'est pas nécessaire de lui révoquer con certificat, il suffit de supprimer son fichier de configuration pour qu'il ne soit plus accepté par OpenVPN.
Déploiement
Dans une configuration simple, il on peut mette le CA sur la même machine que le serveur OpenVPN. Il suffit d'indiquer l'emplacement de la CRL au sein du CA à OpenVPN.
Il peut être préferrable de mettre le CA sur une autre machine (ou carrément d'avoir un CA offline éventuellement avec la clé privées sur une smartcard) : il faut alors bien penser à copier la CRL sur la machine qui fait serveur OpenVPN à chaque fois que l'on révoque un certificat.