Creation d'une autorité de certicification PKI et d'un certificat serveur pour mise en place d'un serveur OpenVPN
Par pepin le vendredi, octobre 27 2017, 21:23 - PKI - Lien permanent
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