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.