Configuración de OpenVPN con Easy-RSA#

Nota

Esta guía es un trabajo en curso, y se actualizará de forma periódica. Por favor, tenga en cuenta este estado.

Esta guía muestra cómo configurar los clientes OpenVPN para que inicien sesión utilizando una Nitrokey Pro 2 o una Nitrokey Storage 2. Para la gestión de claves por software utilizaremos Easy-RSA, una utilidad que ha ido evolucionando junto a OpenVPN.

To sign the certificates, we will use a Nitrokey HSM 2 set up as Certificate Authority, however this guide does not cover the set up of the CA itself (it is clear and well documented here).

Utilizaremos Easy-RSA, porque parece proporcionar cierta flexibilidad, y permite la gestión de claves a través de PKIs externas. Lo utilizaremos en el servidor para emitir la solicitud de firma, y repetiremos el mismo proceso en el cliente. Las solicitudes de firma de certificados serán firmadas por la CA en el HSM de Nitorkey, y retransmitidas al servidor y al cliente.

Requisitos previos#

En la siguiente documentación necesitaremos 3 máquinas diferentes como las siguientes:

  • Servidor OpenVPN (v. 2.5) en Debian 10 (máquina virtual EC2 - AWS)

  • Cliente OpenVPN (v. 2.4.9) en Fedora 30 (máquina local)

  • La Autoridad de Certificación será accesible desde una máquina independiente con Fedora 30 (máquina local)

Para interactuar con los dispositivos necesitaremos OpenSC 0.20 instalado en la máquina cliente y en la máquina CA (las máquinas locales). Puedes seguir las instrucciones para configurarlo en este enlace (*Unix).

Para descargar las dependencias en las máquinas Fedora podemos esta instrucción:

su -c 'dnf install readline-devel openssl-devel libxslt docbook-style-xsl pcsc-lite-devel automake autoconf libtool gcc zlib-devel'

Para Debian Linux, los paquetes más recientes de OpenSC están disponibles aquí.

Utilizaremos las siguientes Nitrokeys para la gestión de claves físicas:

Como recordatorio, para crear una autoridad de certificación en Nitrokey HSM 2, puede seguir las instrucciones disponibles ` en la documentación <certificate-authority.html#sign-a-server-certificate>`_.

Alternativamente, puede configurar su propia CA en un en una máquina separada, o utilizar el tutorial de OpenVPN que también se basa en Easy-RSA. Las 2 últimas opciones dependen de soluciones de software para la gestión de claves.


Del lado del servidor#

1. Instalar OpenVPN#

  1. Primero tenemos que habilitar el Reenvío de IPs editando el archivo /etc/sysctl.conf.

    $ editor /etc/sysctl.conf
    
  2. Descomente o edite en consecuencia la siguiente línea

    net.ipv4.ip_forward=1
    
  3. Cierre después de guardarlo, e introduzca este comando

    $ sysctl -p
    

    Una vez realizado el reenvío de IP, tendremos que descargar la última versión de OpenvPN para nuestro servidor Debian 10, según estas instrucciones:

  4. Cambie a root y descargue la clave GPG que firmó el paquete

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. Añade la URL de los paquetes OpenVPN adecuados al archivo sources.list.

    # echo "deb http://build.openvpn.net/debian/openvpn/release/2.5 buster main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
    # exit
    

    Descargamos OpenVPN 2.5 ya que el «password prompt» requiere al menos OpenVPN versión 2.4.8 para iniciar sesión.

  6. A continuación, descargamos OpenVPN

    $ sudo apt install openvpn
    

    Si quieres comprobar la versión, es posible llamando a --version e imprimir lo siguiente:

    $ sudo openvpn --version
    OpenVPN 2.5_beta3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep  1 2020
    library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10
    Originally developed by James Yonan
    Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
    Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no \ enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=needless enable_fragment=yes enable_iproute2=yes \ enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_maintainer_mode=no enable_management=yes enable_multihome=yes enable_pam_dlopen=no enable_pedantic=no \ enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no \ enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no \ enable_systemd=yes enable_werror=no enable_win32_dll=yes enable_x509_alt_username=yes with_aix_soname=aix with_crypto_library=openssl with_gnu_ld=yes \ with_mem_check=no with_sysroot=no
    

2. Instalar Easy-RSA#

Para construir la PKI, descargaremos la última versión de Easy-RSA en las máquinas servidoras y clientes. Para obtener la última versión, ve a la página Releases en el proyecto oficial GitHub de EasyRSA, copia el enlace de descarga del archivo que termina en .tgz, y luego pégalo en el siguiente comando:

  1. Descargue la última versión

    $ cd ~
    $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
    
  2. Extraer el tarball

    $ cd ~
    $ tar xvf EasyRSA-3.0.7.tgz
    $ mv EasyRSA-3.0.7/ easyrsa/ # rename folder
    

3. Crear una PKI para el servidor OpenVPN#

Antes de crear la clave privada y el certificado de su servidor OpenVPN, debe crear un directorio local de Infraestructura de Clave Pública en su servidor OpenVPN. Utilizará este directorio para gestionar las solicitudes de certificados del servidor y de los clientes, en lugar de hacerlas directamente en su servidor de CA.

Para construir un directorio PKI en su servidor OpenVPN, tendrá que rellenar un archivo llamado vars con algunos valores por defecto.

  1. Crear un archivo vars

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. Una vez abierto el archivo, pegue las dos líneas siguientes

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    Estas son las únicas dos líneas que necesitas en este archivo vars en tu servidor OpenVPN ya que no se utilizará como Autoridad de Certificación. Se asegurarán de que sus claves privadas y solicitudes de certificados estén configuradas para utilizar la criptografía de curva elíptica (ECC) para generar claves, y firmas seguras para sus clientes y el servidor OpenVPN.

    En cuanto a la elección de los algoritmos criptográficos, sigo el modelo de este tutorial, y puedes personalizarlos según tus necesidades específicas.

  3. Inicializar la PKI

    Una vez que haya rellenado el archivo vars puede proceder a crear el directorio PKI. Para ello, ejecuta el script easyrsa con la opción init-pki:

    $ ./easyrsa init-pki
    

    Una vez que haya inicializado su PKI en el servidor OpenVPN, estará listo para pasar al siguiente paso, que es crear una solicitud de certificado y una clave privada para el servidor OpenVPN.

4. Crear server.req y server.key.#

Ahora que su servidor OpenVPN tiene todos los requisitos previos instalados, el siguiente paso es generar un par de claves compuesto por una clave privada (para mantenerla en secreto), y una solicitud de firma de certificado (.csr) en su servidor OpenVPN.

En términos generales, en los sistemas en los que generamos una clave y una petición, estos archivos se dejan sin encriptar utilizando el argumento nopass, ya que los servidores suelen necesitar arrancar sin introducir ninguna contraseña. Esto genera una clave no encriptada, así que ten en cuenta proteger su acceso y los permisos de los archivos con cuidado.

Truco

Notas de configuración de OpenVPN:

  1. The server, and each client, must have their own cert and key

    file. The server and all clients will use the same CA file.

  2. El certificado del servidor debe tener lo siguiente:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Crear la solicitud de firma para el servidor

    Navega al directorio ~/easyrsa en tu servidor OpenVPN como usuario no root, e introduce los siguientes comandos:

    $ cd easyrsa/
    $ ./easyrsa gen-req server nopass
    

    Esto creará una clave privada para el servidor y un archivo de solicitud de certificado llamado server.req.

    Una vez que tenga el certificado firmado, lo transferirá al servidor OpenVPN.

  2. Copiar la clave en el directorio del servidor OpenVPN

    $ sudo cp /home/admin/EasyRSA/pki/private/server.key /etc/openvpn/server/
    

Después de completar estos pasos, ha creado con éxito una clave privada para su servidor OpenVPN. También ha generado una solicitud de firma de certificado para el servidor OpenVPN.

Truco

Extensiones de archivos para solicitudes de firma de certificados

La extensión de archivo que adopta el tutorial de CA y HSM indica la creación de un archivo .csr, sin embargo Easy-RSA crea solicitudes de firma de certificados con una extensión .req.

Utilizaremos indistintamente ambas extensiones, mientras nos aseguramos de transferir los archivos correctos a la Autoridad Certificadora, y generar un certificado final con una extensión .crt.

En la siguiente sección de esta guía, firmaremos un archivo .req con nuestra CA desplegada en el dispositivo HSM 2. Para ello, utilizaré una máquina dedicada para firmar las peticiones.

5. Firmar y recuperar server.crt#

Las siguientes instrucciones requieren la transferencia del archivo server.req (o server.csr) al sistema CA.

La transferencia en sí no es sensible a la seguridad, aunque es conveniente verificar si el archivo recibido coincide con la copia del remitente, si el transporte no es de confianza.

Para realizar estos pasos, me apoyaré ampliamente en estas instrucciones, para firmar las solicitudes de firma de certificados, una vez que las hemos generado con Easy-RSA.

  1. Firme el archivo ``server.req`

    En la máquina local dedicada a acceder al HSM, utilizaremos las herramientas proporcionadas por Opensc 0.20 para firmar el archivo .req, y enviarlo de vuelta al servidor OpenVPN. Suponemos que hemos transferido el archivo desde la máquina del servidor a la máquina de la CA.

    Primero empezamos por enchufar el HSM Nitrokey, y entramos en esta instrucción para listar las llaves disponibles.

    1. Consultar la lista de dispositivos disponibles

      $ p11tool --list-all
      

      (Paso obligatorio) Si es la primera vez que firma un certificado con la CA, es posible que desee recuperar el URI de la clave privada de la CA desde el HSM e incluirlo en el archivo de configuración.

      Nota

      El URI de la llave debe tener este formato:

      pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0104068;token=SmartCard-HSM%20%28UserPIN%29%00%00%00%00%00%00%00%00%00;id=%E0%16%1C%C8%B6%F5%D6%6A%C6%83%5E%CD%EC%B6%23%FC%05%06%A6%75;object=root;type=private
      
    2. Crear openvpn/ directorio bajo certificate-authority/

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. Firma el server.req

      $ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in server.req -out /home/user/pki/issued/server.crt
      
  2. 5.2. Recuperar el archivo server.crt a la máquina del servidor

    1. Transferir los certificados firmados al servidor

      Desde la máquina CA, copiamos los ficheros server.crt y chain.crt al servidor OpenVPN. En este ejemplo utilizaremos el comando scp como sigue:

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Colocar los certificados en el directorio del servidor

      $ mv /tmp/{server.crt,chain.crt} /etc/openvpn/server
      

      Advertencia

      Certificado CA y chain.crt

      En lo anterior, la CA devuelve el certificado firmado del servidor, e incluye el certificado de la CA CA.crt que es el archivo <x id="117"></x id="126"></x>`. Esto puede hacerse a través de un canal inseguro, aunque se anima al cliente a confirmar si el ``chain.crt recibido es válido, si el transporte no es de confianza.

      Es posible renombrar el archivo chain.crt a CA.crt en la máquina de destino, sin embargo usaremos chain.crt en las siguientes instrucciones.

6. Configurar el servidor OpenVPN#

Una conexión que utiliza TLS requiere múltiples certificados y claves para la autenticación. Ahora que los hemos emitido y firmado, podemos colocarlos en los directorios adecuados. El desglose de los certificados y claves que deben ubicarse en el directorio raíz son los siguientes:

OpenVPN server

    - The root certificate file (CA.crt or chain.crt in our setup)
    - Server certificate
    - Server key
    - Diffie Hellman Parameters (optional)

En tu servidor OpenVPN, ahora puedes crear el archivo de configuración server.conf con tu editor de texto favorito. El archivo puede ser configurado de acuerdo a sus necesidades, mientras que nos aseguramos de cambiar el certificado del servidor y las secciones clave de acuerdo a los nombres que eligió para el su los archivos que firmamos:

# OpenVPN Server Certificate - CA, server key and certificate
ca chain.crt
cert server.crt
key server.key

Aquí está el archivo de configuración que podemos utilizar para probar estas instrucciones:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
tls-version-min 1.2 # Lower boundary for TLS version
tls-version-max 1.2 # Higher boundary for TLS version

Para comprobar si la configuración funciona correctamente, podemos utilizar este comando:

$ sudo openvpn --server --config server.conf

7. Inicie el servicio OpenVPN en el servidor#

Habilite el servicio OpenVPN añadiéndolo a systemctl, e inícielo utilizando estos comandos:

$ sudo systemctl -f enable openvpn@server
$ sudo systemctl start openvpn@server

Para comprobar dos veces si el servicio OpenVPN está activo, utilice este comando:

$ sudo systemctl status openvpn@server

El OpenVPN debería estar funcionando en este punto.


Configuración del lado del cliente#

1. Instalar OpenVPN y Easy-RSA#

  1. Instalar el software

    Podemos utilizar directamente dnf install para instalar OpenVPN 2.4.9 y Easy-RSA 3.0.7

    $ sudo dnf install openvpn easy-rsa
    
  2. Luego creamos como no-root un directorio para Easy RSA llamado Easy-RSA

    $ mkdir ~/easyrsa
    
  3. Y enlazarlo con el paquete Easy RSA que acabamos de instalar

    $ ln -s /usr/share/easy-rsa/3/* ~/easyrsa/
    

2. Crear una PKI para el cliente OpenVPN#

De la misma manera que creamos una PKI en el servidor OpenVPN, crearemos una PKI usando Easy-RSA en el lado del cliente.

3. Crear un client.req y client.key.#

De la misma manera que emitimos el par de claves en el servidor, generamos un par de claves para el cliente que estará compuesto por el fichero client.req y el fichero client.key. Este último debe mantenerse en secreto en la máquina cliente.

4. Firmar client.req y emitir el fichero client.crt.#

Para transferir el archivo client.req a la máquina CA, utilizaremos el mismo método que utilizamos para el archivo server.req.

Una vez transferido, en la máquina de la CA firmamos el archivo de solicitud de firma de certificado con este comando

$ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in client.req -out /home/user/pki/issued/client.crt

5. Importar client.crt en la Nitrokey desde la máquina CA.#

Después de crear el archivo client.crt, conectamos el dispositivo Nitrokey Pro 2 en la máquina CA, e importamos el .crt al dispositivo Pro 2 utilizando este comando:

$ pkcs15-init --store-certificate client.crt --id 3

Puedes ver si la clave está efectivamente almacenada en el Nitrokey usando este comando:

$ pkcs15-tool -c

O bien

$ pkcs11-tool --list-objects

Para más comandos puedes consultar la wiki de OpenSC.

6. Recuperar el archivo chain.crt de la máquina CA.#

Mientras que mantenemos el archivo client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt en la máquina cliente, y lo almacenamos en el directorio adecuado. Podemos utilizar scp como en el método explicado en la sección del servidor de esta guía.

7. Configurar el cliente para interactuar con el Nitrokey#

Ahora, de vuelta en la máquina cliente, conectaremos el Nitrokey Pro y lo utilizaremos para establecer la conexión VPN con el servidor. En términos generales, una conexión que utiliza TLS requiere múltiples certificados y claves para la autenticación:

OpenVPN client
    - The root certificate file (`chain.crt`)
    - Client certificate
    - Client key

Para esta guía podemos el siguiente archivo client.conf, y añadirle las opciones necesarias en consecuencia:

client
dev tun
proto udp
remote <server> 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
remote-cert-tls server
cipher AES-256-CBC
verb 3
redirect-gateway def1
tls-version-min 1.2 # Lower boundary for TLS version
tls-version-max 1.2 # Higher boundary for TLS version
  1. Determinar el objeto correcto

    Cada proveedor PKCS#11 puede admitir varios dispositivos. Para ver la lista de objetos disponibles puede utilizar el siguiente comando:

    $ openvpn --show-pkcs11-ids /usr/lib64/pkcs11/opensc-pkcs11.so
    
    The following objects are available for use.
    Each object shown below may be used as parameter to
    
    --pkcs11-id option please remember to use single quote mark.
    
    Certificate
            DN:             CN=client
            Serial:         E53DA75C5B8F1518F520BCEF0128C09F
            Serialized id:  pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03
    

    Cada par certificado/clave privada tiene una cadena única Serialized id. La cadena de id serializada del certificado solicitado debe ser especificada, en el archivo de configuración. Podemos hacerlo añadiendo la opción pkcs11-id utilizando comillas simples.

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. Añadir el ID serializado recuperado al archivo de configuración

    Utilizando su editor de texto favorito, abra el archivo server.conf, y añada las siguientes líneas, teniendo cuidado de insertar las suyas propias Serialized id:

    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    

    Para la configuración adicional relacionada con la autenticación OpenVPN, también puede añadir unas líneas para manejar la gestión de claves, aunque es opcional.

    Nota

    Haga clic para ver el código

    # nitrokey config
    
    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    # pkcs11-pin-cache 300
    # daemon
    # auth-retry nointeract
    # management-hold
    # management-signal
    # management 127.0.0.1 8888
    # management-query-passwords
    pkcs11-cert-private 1 # Prompt for PIN
    

    Paso opcional

    Si necesitas probar la configuración, con y sin el token en la Nitrokey, puedes añadir líneas al mismo client.conf y comentar/descomentar las líneas pertinentes según tus necesidades:

    Nota

    Haga clic para ver el código

    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  3. Configurar el cliente OpenVPN

    El archivo de configuración final client.conf debería tener este aspecto:

    client
    dev tun
    proto udp
    remote <server> 1194
    resolv-retry infinite
    nobind
    user nobody
    group nobody
    persist-key
    persist-tun
    ca ca.crt
    remote-cert-tls server
    cipher AES-256-CBC
    verb 3
    redirect-gateway def1
    tls-version-min 1.2 # Lower boundary for TLS version
    tls-version-max 1.2 # Higher boundary for TLS version
    
    # nitrokey login
    
    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    # pkcs11-pin-cache 300
    # daemon
    # auth-retry nointeract
    # management-hold
    # management-signal
    # management 127.0.0.1 8888
    # management-query-passwords
    pkcs11-cert-private 1 # Prompt for PIN
    
    # OR
    
    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  4. Configure OpenVPN (Windows only)

    Para establecer un handshake, debe configurar OpenSSL incluido en OpenVPN.

    Cree el directorio ssl en C:\Program Files\OpenVPN y cree el archivo openssl.cnf con el siguiente contenido :

    openssl_conf = default_conf

    [ default_conf ] ssl_conf = ssl_sect

    [ ssl_sect ] system_default = ssl_default_sect

    [ ssl_default_sect ] Algoritmos de firma = RSA+SHA512:ECDSA+SHA512:RSA+SHA384:ECDSA+SHA384:RSA+SHA256:ECDSA+SHA256 MaxProtocolo = TLSv1.2 MinProtocolo = TLSv1.2

    Con esta modificación, usted no tendrá error como se informa aquí, aquí y aquí

  5. Problemas conocidos

    Hay algunos problemas conocidos relacionados con el inicio de sesión de OpenVPN con OpenSC. Por favor, consulte estos problemas aquí.

8. Inicie el cliente OpenVPN#

  1. Iniciar el servicio OpenVPN en el cliente

    Habilite el servicio OpenVPN, e inícielo utilizando estos comandos:

    $ sudo systemctl -f enable openvpn-server@server.service
    $ sudo systemctl start openvpn-server@server.service
    

    Para comprobar si el servicio OpenVPN está activo, utilice este comando:

    $ sudo systemctl status openvpn-server@server.service
    
  2. Introduzca su PIN de usuario

    Al ejecutar el cliente OpenVPN, es necesario introducir el PIN de Nitrokey:

    $ sudo openvpn --client --config client.conf
    Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020
    Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS  21 Apr 2020, LZO 2.08
    Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so'
    Enter User PIN (OpenPGP card) token Password: ******
    

    Advertencia

    Unfortunately OpenVPN doesn’t seem to be able to establish a handshake on some operating systems and stops at an error as reported here, here and here

    This is what the error output looks like:
    
    $ sudo openvpn --client --config client.conf
    Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020
    Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS  21 Apr 2020, LZO 2.08
    Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so'
    Enter User PIN (OpenPGP card) token Password: ******``
    Fri Sep 11 17:42:12 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]18.157.180.240:1194``
    Fri Sep 11 17:42:12 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]``
    Fri Sep 11 17:42:12 2020 UDP link local: (not bound)
    Fri Sep 11 17:42:12 2020 UDP link remote: [AF_INET]18.157.180.240:1194
    Fri Sep 11 17:42:12 2020 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
    Fri Sep 11 17:42:12 2020 TLS: Initial packet from [AF_INET]18.157.180.240:1194, sid=d79690cf 9e38ce89
    Fri Sep 11 17:42:12 2020 VERIFY OK: depth=1, CN=server_CA
    Fri Sep 11 17:42:12 2020 VERIFY KU OK
    Fri Sep 11 17:42:12 2020 Validating certificate extended key usage
    Fri Sep 11 17:42:12 2020 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
    Fri Sep 11 17:42:12 2020 VERIFY EKU OK
    Fri Sep 11 17:42:12 2020 VERIFY OK: depth=0, CN=server
    Fri Sep 11 17:42:12 2020 OpenSSL: error:141F0006:SSL routines:tls_construct_cert_verify:EVP lib
    Fri Sep 11 17:42:12 2020 TLS_ERROR: BIO read tls_read_plaintext error
    Fri Sep 11 17:42:12 2020 TLS Error: TLS object -> incoming plaintext read error
    Fri Sep 11 17:42:12 2020 TLS Error: TLS handshake failed
    Fri Sep 11 17:42:12 2020 SIGUSR1[soft,tls-error] received, process restarting
    Fri Sep 11 17:42:12 2020 Restart pause, 5 second(s)
    

    En algunos casos reportados no pide el PIN en la terminal. Una solución sería utilizar este comando para iniciar sesión con el PIN:

    $ telnet 8888 password 'User PIN (OpenPGP card) token' <PIN>
    

    Alternativamente, podrías recompilar el cliente OpenVPN con el soporte de systemd deshabilitado, y te pedirá el PIN como se espera.

    Otra opción, sería iniciar sesión en su instancia OpenVPN con el cliente Viscosity que proporciona una mejor experiencia de usuario, especialmente para introducir el PIN.