Générer des certificats pour Ipsec avec Openssl

Dans un précédant article, j’ai pu configurer un serveur ipsec dans ipfire, soit mettre en place un serveur Ipsec/Strongswan et des clients Windows 7, Debian 7 ou Iphone, tout par le programme « ipsec pki » . Dans cet article, j’utilise uniquement le programme Openssl. Pour simplifier le processus de création des certificats d’autorités, client et serveur, je m’appuie sur mes scripts stockés sur Github.

A/ En résumé :

Avant de se lancer, je tiens à vous signaler qu’il ne faut surtout pas mettre des caractères avec des accents. En effet, la connexion VPN ne se fera pas à cause d’un différent sur les jeux de caractères (ANSI/UTF8). Les scripts suivants permettent de modifier les fichier de configuration à la volé et de générer tous les certificats.

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »rootfs/root/openssl » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]

En détail

Petit rappel: Openssl s’appuie sur le fichier /etc/ssl/openssl.cnf par défaut, cependant, il est possible de spécifier un autre fichier avec l’otion [-config $FILE]. Un certificat est composé de 2 fichiers, une clé privé et une clé publique. Dans le cas d’une configuration IpSec, le client doit avoir le drapeau  clientAuth  et serverAuth et doivent être signé par la même autorité.

B/ Le fichier de configuration d’OpenSSL.

B.1/ Génération du certificat d’autorité

Dans un premier temps, le champs [ca] dans le fichier openssl.cnf désigne l’autorité par défaut, soit [ROOT].

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/etc/ssl/openssl.cnf » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]

  • Policy_match sont les règles définies pour autoriser la création d’un sous certificat d’autorité.
  • req_distinguished_name normalise les champs composants le certificat. Les champs terminant par _default permettent à OpenSSL de suggérer une valeur lors de la génération du certificat. Je vous invite à renseigner la localité, le mail, la ville et le nom de l’organisation, le reste diffère.
  • Bien definir pour le certificat d’autorité la variable keyUsage avec les drapeaux critical, digitalSignature, cRLSign, keyCertSign.

Le fichier openssl.cnf renseigné à ce point, il est tout à fait possible de définir son certificat d’autorité.

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/usr/local/sbin/caroot » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]
Ensuite, lançons le premier script.

caroot

B.2/ Génération d’un sous certificat d’autorité

Pour simplifier les choses,  je préfère utiliser un autre fichier de configuration pour ipsec.

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/etc/ssl/ipsec.cnf » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]

Script pour générer un sous-certificat d’autorité.

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/usr/local/sbin/casec » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]

Pour générer le certificat d’autorité pour Ipsec, lançons le deuxième script.

casec

B.3/ Génération du certificat serveur.

DNS.1 est l’étiquette qui doit correspondre absolument à l’adresse IP ou FQDN du serveur dans le fichier ipsec.cnf.

  • extentedKeyUsage prend la valeur serverAuth, soit l’option pour que le certificat soit exploitable par un serveur ipsec.
  • Il est possible de générer plusieurs certicats pour autant de serveur.

Puis, pour générer le certificat serveur:

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/usr/local/sbin/secsrv » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]
Puis, lançons le troisième script.

[bash]secsrv[/bash]

B.4/ Génération du certificat client.

Dans le fichier ipsec.cnf, à noté que extentedKey prend la valeur clientAuth, soit l’option pour que le certificat soit exploitable par un client ipsec.

Il est possible de générer plusieurs certificats serveurs pour le même client sous la même autorité.
Donc, pour générer le certificat client:

[pcsh lang= »bash » user= »jbsky » repos= »jbsky » path_id= »ipfire/rootfs/usr/local/sbin/secacces » revision= »master » tab_size= »4″ hl_lines= » » provider= »github »/]

Enfin, lançons le dernier script.

[bash]secacces[/bash]