GNU/Linux >> Tutoriales Linux >  >> Debian

Configure la autenticación de certificado en OpenConnect VPN Server (ocserv)

Este tutorial le mostrará cómo configurar la autenticación de certificado en el servidor OpenConnect VPN (ocserv) en Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) es una implementación de código abierto del protocolo Cisco AnyConnect VPN.

En un artículo anterior, expliqué los pasos para configurar el servidor OpenConnect VPN con el certificado de servidor Let's Encrypt TLS. Let's Encrypt no emite un certificado de cliente, por lo que en ese artículo usamos autenticación de contraseña. Ingresar el nombre de usuario y la contraseña cada vez puede ser una molestia, especialmente si el software del cliente, como la aplicación Cisco AnyConnect en iOS, no ofrece una opción para recordar contraseñas. Muchos software de cliente de OpenConnect pueden importar certificados de usuario, lo que liberará al usuario de ingresar el nombre de usuario y la contraseña. La autenticación mediante certificado también es más segura que la autenticación mediante contraseña.

Requisitos

Para seguir este tutorial, se supone que ya ha configurado un servidor VPN OpenConnect con el certificado de servidor TLS de Let's Encrypt. De lo contrario, siga uno de los siguientes tutoriales.

  • Configure OpenConnect VPN Server (ocserv) en Ubuntu 20.04 con Let's Encrypt
  • Configure OpenConnect VPN Server (ocserv) en Debian 11 Bullseye con Let's Encrypt
  • Configure OpenConnect VPN Server (ocserv) en CentOS 8/RHEL 8 con Let's Encrypt

Configuraremos nuestra propia CA (Autoridad de certificación) para firmar el certificado del cliente. El ocserv el demonio debe continuar usando el certificado del servidor TLS emitido por Let's Encrypt, por lo que el software del cliente no mostrará una advertencia de seguridad.

Configuración de su propia CA (autoridad de certificación)

Queremos usar la autenticación de certificado, pero Let's Encrypt no emite un certificado de cliente, por lo que debemos crear nuestra propia CA. Puedes usar openssl para hacer el trabajo, pero ocserv recomienda GnuTLS, así que le mostraré cómo usar GnuTLS.

Instalar gnutls-bin paquete en el servidor Debian/Ubuntu.

sudo apt install gnutls-bin

Instalar gnutls-utils paquete en CentOS/RHEL.

sudo dnf install gnutls-utils

Cree un subdirectorio en /etc/ocserv/ para mantener claves privadas y certificados.

sudo mkdir /etc/ocserv/ssl/

Cambia tu directorio de trabajo.

cd /etc/ocserv/ssl/

Genere una clave privada para la CA con certtool comando, que es proporcionado por gnutls-bin o gnutls-utils paquete. De forma predeterminada, genera una clave RSA de 3072 bits, que es suficiente.

sudo certtool --generate-privkey --outfile ca-privkey.pem

Antes de generar el certificado de CA, creemos el archivo de plantilla de certificado de CA. El formato de archivo de la plantilla se puede encontrar en el manual de certtool (man certtool ).

sudo nano ca-cert.cfg

Agregue las siguientes líneas al archivo. Reemplace los marcadores de posición con los valores apropiados.

# X.509 Certificate options

# The organization of the subject.
organization = "vpn.example.com"

# The common name of the certificate owner.
cn = "Example CA"

# The serial number of the certificate.
serial = 001

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = -1

# Whether this is a CA certificate or not
ca

# Whether this certificate will be used to sign data
signing_key

# Whether this key will be used to sign other certificates.
cert_signing_key

# Whether this key will be used to sign CRLs.
crl_signing_key

Guarde y cierre el archivo. Ahora genere el certificado de CA utilizando las configuraciones del archivo de plantilla.

sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem

Ahora tenemos un archivo de certificado de CA (ca-cert.pem ).

Generando Certificado de Cliente

Ahora ejecute el siguiente comando para generar la clave privada del cliente.

sudo certtool --generate-privkey --outfile client-privkey.pem

Cree el archivo de plantilla de certificado de cliente.

sudo nano client-cert.cfg

Agregue las siguientes líneas en el archivo. El uid debe ser un nombre de usuario en /etc/ocserv/ocpasswd archivo.

# X.509 Certificate options
# The organization of the subject.
organization = "vpn.example.com"

# The common name of the certificate owner.
cn = "John Doe"

# A user id of the certificate owner.
uid = "username"

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = 3650

# Whether this certificate will be used for a TLS server
tls_www_client

# Whether this certificate will be used to sign data
signing_key

# Whether this certificate will be used to encrypt data (needed
# in TLS RSA ciphersuites). Note that it is preferred to use different
# keys for encryption and signing.
encryption_key

Guarde y cierre el archivo. Luego ejecute el siguiente comando para generar el certificado de cliente, que será firmado por la clave privada de CA.

sudo certtool --generate-certificate --load-privkey client-privkey.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --template client-cert.cfg --outfile client-cert.pem

Combine la clave privada y el certificado del cliente en un archivo PKCS #12 protegido por un PIN.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder

Ahora tenemos la clave privada y el certificado del cliente combinados en un archivo client.p12 .

Tenga en cuenta que la aplicación Ciso AnyConnect en iOS no es compatible con el cifrado AES-256. Se negará a importar el certificado del cliente. Si el usuario está utilizando un dispositivo iOS, puede elegir 3des-pkcs12 cifrado.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outder

La clave privada y el certificado del cliente combinados en un archivo ios-client.p12 .

Solicitud de firma de certificado

Este paso solo es necesario si hay varios usuarios de VPN y el usuario quiere usar su propia clave privada.

Para mantener en secreto las claves privadas de los usuarios finales, los usuarios pueden generar una solicitud de firma de certificado (CSR) con sus propias claves privadas y luego enviar solicitudes de certificado al administrador, quien luego emite certificados de cliente a los usuarios. Primero, deben generar la clave privada y la plantilla de certificado de cliente utilizando los comandos mencionados anteriormente. Luego genere un CSR con el siguiente comando. El request.pem el archivo está firmado por la clave privada del usuario.

certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pem

A continuación, el usuario envía el request.pem y client-cert.cfg archivo al administrador, que ejecuta el siguiente comando para generar el certificado de cliente.

sudo certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --load-request request.pem --template client-cert.cfg --outfile client-cert.pem

Después de eso, el administrador envía client-cert.pem archivo de certificado al usuario.

Habilitación de la autenticación de certificados en ocserv Daemon

Edite el archivo de configuración de ocserv.

sudo nano /etc/ocserv/ocserv.conf

En el tutorial anterior, agregamos la siguiente línea para habilitar la autenticación de contraseña.

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Para habilitar la autenticación de certificados, descomente la siguiente línea.

auth = "certificate"

Si las dos líneas anteriores no están comentadas, eso significa que el usuario debe pasar tanto la autenticación de contraseña como la autenticación de certificado. Entonces, si la autenticación del certificado es suficiente para probar la identidad, comente la primera línea.

Si permite que los usuarios elijan autenticación de certificado o autenticación de contraseña, entonces debería tener las siguientes líneas en su lugar.

enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"
auth = "certificate"

Ahora busque el parámetro ca-cert. En Debian/Ubuntu, está configurado para

ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem

En CentOS 8/RHEL 8, está configurado en

ca-cert = /etc/ocserv/ca.pem

Necesitamos usar nuestro propio certificado CA para verificar el certificado del cliente, así que cambie esta línea a

ca-cert = /etc/ocserv/ssl/ca-cert.pem

A continuación, busque la siguiente línea.

cert-user-oid = 0.9.2342.19200300.100.1.1

No necesitas cambiarlo. Solo quiero decirte que 0.9.2342.19200300.100.1.1 representa el UID archivado en el certificado del cliente. La línea de arriba le dice a ocserv daemon para buscar el nombre de usuario en el campo UID del certificado de cliente. Si el certificado de cliente es verificado con éxito por el certificado de CA y ocserv daemon puede encontrar un nombre de usuario coincidente en /etc/ocserv/ocpasswd archivo, entonces el cliente puede iniciar sesión.

Guarde y cierre el archivo. Luego reinicie ocserv.

sudo systemctl restart ocserv

Uso de la autenticación de certificados en Debian/Ubuntu/CentOS/RHEL Desktop

Usa el scp comando para descargar el client.p12 archivo a su escritorio Debian/Ubuntu/CentOS/RHEL.

scp [email protected]:/etc/ocserv/ssl/client.p12 ~

Luego instale el openconnect software de cliente.

Debian/Ubuntu:

sudo apt install openconnect

CentOS/RHEL:

sudo dnf install epel-release
sudo dnf install openconnect

Para usar la autenticación de certificado, ejecute

sudo openconnect -b vpn.example.com -c client.p12

Se le pedirá que desbloquee la clave privada del cliente con la frase de contraseña que configuró anteriormente en este tutorial.

Si la frase de contraseña se ingresó correctamente, ahora debería estar conectado al servidor VPN.

Uso de la autenticación de certificados en escritorio de Windows y MacOS

Descargue el cliente de GUI de OpenConnect para Windows o MacOS desde la página de Github de la GUI de OpenConnect. Luego cree un nuevo perfil de conexión VPN e importe el archivo PKCS #12 al campo de certificado de usuario. Haga clic en el botón Guardar. Deberá ingresar el PIN para desbloquear la clave privada. Una vez importado, ya no tiene que ingresar el nombre de usuario y la contraseña.

Uso de la autenticación de certificados en un dispositivo iOS

Los usuarios de iOS pueden usar la aplicación Cisco AnyConnect. Para importar un certificado de cliente en la aplicación AnyConnect, primero puede enviar el archivo PKCS #12 a su dirección de correo electrónico en un archivo adjunto. Luego abra la aplicación de correo en iOS. Toque el archivo adjunto unos segundos y compártalo con AnyConnect. Luego ingrese el PIN para importar el archivo.

Una vez que se haya importado, edite su conexión VPN en AnyConnect. Ir a Advanced -> Certificate y seleccione el certificado de cliente. Guarde su configuración.

Ahora ya no tiene que ingresar el nombre de usuario y la contraseña en su dispositivo iOS. La aplicación Cisco AnyConnect no recuerda el nombre de usuario ni la contraseña, por lo que en el modo de autenticación de contraseña, la conexión VPN se interrumpirá cuando el teléfono no esté en uso. En el modo de autenticación de certificado, la aplicación se volverá a conectar automáticamente al servidor VPN si se interrumpe la conexión.

Problemas con el cliente AnyConnect en iOS

La última versión del cliente AnyConnect en iOS tiene un problema al usar la autenticación de certificados en el protocolo TLS 1.3. Si ve el siguiente error en el registro de ocserv (sudo journalctl -eu ocserv ), tienes el mismo problema.

GnuTLS error (at worker-vpn.c:795): A TLS fatal alert has been received.

O necesita usar la autenticación de contraseña en el cliente AnyConnect iOS o deshabilitar TLS 1.3 en el archivo de configuración ocserv. Para deshabilitar TLS1.3, busque tls-priorities parámetro en el /etc/ocserv/ocserv.conf y agregue :-VERS-TLS1.3 al final para deshabilitar TLS 1.3.

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3"

Guarde y cierre el archivo. Luego reinicie ocserv.

sudo systemctl restart ocserv

Nota :Si ve el SSL 3.3 frase en los registros de ocserv, no entre en pánico. SSL 3.3 es otra palabra para TLS 1.2. Está utilizando una conexión TLS segura.


Debian
  1. Cómo configurar WireGuard VPN en Ubuntu (una guía paso a paso)

  2. Cómo establecer y configurar una autoridad de certificación en Ubuntu 22.04

  3. Servidor VPN PPTP

  4. Cómo configurar un servidor SFTP en Debian 11 Server

  5. Configurar la autenticación multifactor para SSH en Ubuntu 20.04

Configure su propio servidor VPN WireGuard en Debian 11 y Debian 10

Configurar OpenConnect VPN Server (ocserv) en Debian 10 Buster

Configure OpenConnect VPN Server (ocserv) en Ubuntu 18.04/16.04 con Let's Encrypt

Configure OpenConnect VPN Server (ocserv) en Ubuntu 20.04 con Let's Encrypt

Configurar la autenticación de dos factores SSH (2FA) en el servidor Ubuntu

¿Cómo configurar un Pptp Vpn en el propio servidor Ubuntu?