Création de l'arborescence et des fichiers nécessaires :

cd /etc/ssl
mkdir newcerts
touch index.txt index.txt.attr serial
echo 00 > crlnumber

Création du certificat d'autorité :

export SUBJ='/CN=vpn.domain.tld/ST=state/L=locality/O=organisation/C=AU'
openssl req -x509 -config /etc/ssl/openssl.cnf -newkey rsa:8192 -sha256 -days 3650 -keyout private/root_ca.key -out root_ca.pem -subj "$SUBJ"
openssl x509 -serial -noout -in root_ca.pem | cut -d= -f2 > serial
chmod -R 600 /etc/ssl/private

Mise a jour du serial :

openssl x509 -serial -noout -in root_ca.pem | cut -d= -f2 > serial

Nous pourrions déclarer une autorité de certification intermédiaire pour signer nos certificats serveurs et clients, mais cela n'est pas utile en soit.

Nous allons maintenant générer le certificat du serveur openvpn, puis le signer avec notre autorité root_ca :

export SUBJ='/CN=vpn.domain.tld/ST=state/L=locality/O=organisation/C=AU'
openssl req -nodes -newkey rsa:2048 -keyout $vpn.key -out $vpn.req -subj "$SUBJ"
openssl ca -keyfile private/root_ca.key -cert root_ca.pem -in $vpn.req -out $vpn.pem
openssl ca -keyfile private/root_ca.key -cert root_ca.pem -in $vpn.req -out $vpn.pem

Nous allons maintenant générer un certificat pour un client, puis le signer avec notre autorité root_ca :

export client='client.domain.tld'
export SUBJ='/CN=client.domain.tld/ST=state/L=locality/O=organisation/C=AU'
openssl req -nodes -newkey rsa:2048 -keyout $client.key -out $client.req -subj "$SUBJ"
openssl ca -keyfile private/root_ca.key -cert root_ca.pem -in $client.req -out $client.pem

Génération du certificat de révocation "keys.crl" :

openssl ca -config openssl.cnf -gencrl -out keys.crl -keyfile private/root_ca.key -cert root_ca.pem

Installation des fichiers générés dans /etc/openvpn/ssl :

mkdir /etc/openvpn/ssl
mv $vpn.* /etc/openvpn/ssl/
mkdir /etc/openvpn/keys/
cp /etc/ssl/keys.crl /etc/openvpn/keys/crl.pem
mv dh2048.pem /etc/openvpn/ssl/

Génération d'une clef Diffie-Hellman de 2048 bits:

openssl dhparam -out dh2048.pem 2048

Génération d'une clef TLS (afin de bloquer les attaques DoS ou le flood UDP)

openvpn --genkey --secret /etc/openvpn/ssl/ta.key

Création de la chaine de certification :

cat /etc/ssl/root_ca/root_ca.pem > /etc/openvpn/ssl/ca_chain.pem

Création du fichier de configuration :

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz

Cela vous donne un fichier avec les options principales que vous pouvez utiliser pour votre serveur. Mais pour faire plus simple, voici un fichier contenant les directives essentielles :

local 0.0.0.0
port 1194
proto tcp
dev tun

ca ssl/ca_chain.pem
cert ssl/$vpn.crt
key ssl/$vpn.key
crl-verify keys/crl.pem
dh server/dh2048.pem

# Configure server mode and supply a VPN subnet
server 192.168.90.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.0.0"
push "route 172.23.0.0 255.255.0.0"

keepalive 10 120

tls-auth server/ta.key 0 # This file is secret
cipher AES-256-CBC
max-clients 10
log-append /var/log/openvpn.log
verb 3

Enfin, révoquer un certificat (car il faut bien bannir un utilisateur parfois) :

openssl ca -revoke client.domain.tld.pem -config openssl.cnf -keyfile private/root_ca.key -cert root_ca.pem
openssl ca -config openssl.cnf -gencrl -out keys.crl -keyfile private/root_ca.key -cert root_ca.pem
cp keys.crl /etc/openvpn/keys/crl.pem
service openvpn@vpn restart