Instalación

Linux, Raspberry y asimilados:

# apt-get install openvpn

Windows

https://openvpn.net/index.php/open-source/downloads.html

Generar certificados

Se trata de generar un certificado digital (clave pública y una privada) autofirmada por una autoridad de certificación (CA) que previamente crearemos nosotros.

Este proceso está explicado en el post sobre generación de certificados autofirmados.

Al final de este artículo, puedes ver un script para facilitarlo todo.

Además de lo anterior, hay que generar un DiffieHellman:
openssl dhparam -out dh2048.pem 2048

Generados los certificados, tendremos los siguientes ficheros.

  • Clave privada de nuestra CA – Solo usado para firmar el resto de certificados
  • Clave pública de nuestra CA – En el servidor y en el cliente
  • Clave privada de nuestro servidor – Solo en el servidor
  • Clave pública de nuestro servidor – Solo en el servidor
  • Clave privada de nuestro cliente – Solo en el cliente
  • Clave pública de nuestro cliente – Solo en el cliente
  • DiffieHellman – En el servidor y en el cliente

Cada uno de esos ficheros los tendremos que copiar donde se indica, según el rol que vaya a tener el equipo (cliente o servidor)

En linux, el directorio debería ser /etc/openvpn/server para el servidor o /etc/openvpn/client para el cliente

En windows esa carpeta debería estar en:

C:\Program Files\OpenVPN\config

Configuración del fichero .conf del servidor

Si estan comprimidas,  descomprimir una configuración de ejemplo de servidor. Si no, copiar el fichero.

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz |sudo tee /etc/openvpn/server.ovpn

Modificar los parámetros con los nombres de los ceritificados
ca ca_pub.pem
cert server_pub.pem
key server_priv.pem
dh dh2048.pem

Configuración del fichero .conf del cliente

Si estan comprimidas, descomprimir una configuración de ejemplo de cliente. Si no, copiar el fichero.

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/client.conf.gz |sudo tee /etc/openvpn/client.conf

Modificar los parámetros con los nombres de los ceritificados del fichero de confiuguración


# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 192.168.1.20 1194
ca ca_pub.pem
cert client_pub.pem
key client_priv.pem
dh dh2048.pem

En este caso 192.168.1.20 será la dirección del servidor. También podría ser un nombre DNS.

Probando el servicio

Antes de lanzar el servicio lo mejor es que lo pruebes desde la consola. De esta manera podrás ver qué está pasando, seguramente nada bueno. Desde la carpeta donde tengas el fichero .conf del servidor

openvpn server.conf

Así mismo podrás probar el fichero del cliente en el mismo equipo antes de probar desde otros equipos (así puedes depurar préviamente errores de configuración antes de depurar problemas de conexión)

openvpn client.opvn

Arrancar servicio

systemctl start openvpn@server

Como a la primera no va a funcionar, tendrás que revisar el log:
journalctl -xe

 

Script

Un script vale más que mil palabras. En concreto éste:

  1. Crea una clave pública y privada de nuestro CA
  2. Para nuestro servidor OpenVPN, crear una clave privada y una petición de clave pública que será firmada por nuestra CA
  3. Para nuestro cliente OpenVPN, crear una clave privada y una petición de clave pública que será firmada por nuestra CA
  4. Firma la petición del certificado digital del servidor, añadiendo las extensiones de poder usarlo como autenticación en servidor TLS
  5. Firma la petición del certificado digital del cliente

Primero debemos crear el fichero cert-server-extensions.cnf

[ server ]
# Para poder usarlo de certificado en el servidor
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, keyEncipherment

Y a continuación lanzar el siguiente script. En negrita se muestran los parámetros que debemos revisar.

#!/bin/bash
ca_pass=clave_de_la_ca
server_pass=clave_del_servidor
client_pass=clave_del_cliente

echo ---------------------
echo CREANDO CA
echo ---------------------
openssl req -x509 -newkey rsa:2048 -passout pass:"$ca_pass" -keyout ca_priv.pem -out ca_pub.pem -days 365

echo --------------------------------
echo CREANDO CERTIFICADO DEL SERVIDOR
echo --------------------------------
echo Generando petición del certificado del servidor para ser firmado
openssl req -newkey rsa:2048 -subj "/DC=mi,/DC=dominio,/DC=com,/CN=server" -passout pass:"$server_pass" -keyout server_priv.pem -out server_pet.pem

echo ---------------------------------------------
echo FIRMANDO EL CERTIFICADO DE SERVIDOR CON LA CA
echo ---------------------------------------------
openssl x509 -extfile cert-server-extensions.cnf -extensions 'server' -CA ca_pub.pem -passin pass:"$ca_pass" -CAkey ca_priv.pem -req -in server_pet.pem -days 3650 -sha1 -CAcreateserial -out server_pub.pem

echo -------------------------------
echo CREANDO CERTIFICADO DEL CLIENTE
echo -------------------------------
echo Generando petición del certificado del cliente para ser firmado
openssl req -newkey rsa:2048 -subj "/DC=mi,/DC=dominio,/DC=com,/CN=client" -passout pass:"$client_pass" -keyout client_priv.pem -out client_pet.pem

echo ---------------------------------------------
echo FIRMANDO EL CERTIFICADO DE CLIENTE CON LA CA
echo ---------------------------------------------
openssl x509 -CA ca_pub.pem -passin pass:"$ca_pass" -CAkey ca_priv.pem -req -in client_pet.pem -days 3650 -sha1 -CAcreateserial -out client_pub.pem

echo ---------------------------------------------
echo CREANDO DIFFIE-HELLMAN
echo ---------------------------------------------
#openssl dhparam -out dh2048.pem 2048