Tres hechos distintos se funden en una sola línea en la mayoría de los debates sobre OpenVPN y TLS: qué puede hacer tu compilación de cliente, qué permite el perfil y qué negoció realmente la sesión. Una lista corta de suites de TLS 1.3 solo responde a medias la pregunta del medio, y no dice nada sobre el límite inferior de la versión del protocolo. Recorre las comprobaciones siguientes en orden y detente en la primera que no se cumpla, porque cada comprobación posterior da por sentado que las anteriores están resueltas.

Comprueba la compilación antes de leer cualquier lista

Una directiva de configuración no puede añadir soporte de protocolo a un binario que carece de él. Empieza por el banner de versión, que nombra la biblioteca criptográfica compilada:

openvpn --version

Una compilación 2.6 enlazada con OpenSSL acepta tanto tls-cipher como tls-ciphersuites. Una compilación con mbed TLS no tiene ninguna selección de suites de TLS 1.3, y el manual 2.6 marca tls-ciphersuites como una opción de OpenSSL. Si el servidor se recompila con otro backend, el mismo perfil puede cambiar de comportamiento sin que cambie una sola línea de configuración.

Ya que estás aquí, ejecuta openvpn --show-tls y guarda la salida. Es el inventario con el que compararás más adelante, y es barato capturarlo antes de que alguien empiece a editar perfiles.

Escribe el banner y la lista en el ticket de cambio, no en una ventana de chat. Cuando dos personas discuten si un cliente podría ofrecer una suite dentro de seis semanas, la salida capturada lo resuelve en una línea.

Mantén los límites de versión separados de las listas de cifrados

En el manual 2.6 estos son tres controles, no uno:

  • tls-cipher fija la política de cifrados para TLS 1.2 y anteriores, y se pasa a la lista de cifrados de OpenSSL;
  • tls-ciphersuites selecciona suites de TLS 1.3;
  • tls-version-min y tls-version-max limitan las versiones de protocolo que la conexión puede usar.

Así que una lista de suites de TLS 1.3 cuidadosamente recortada no demuestra nada sobre que una versión anterior siga permitida. Si el requisito es «solo TLS 1.3», lo sostiene el límite inferior de versión, y la lista de suites solo estrecha las opciones dentro de ese límite:

tls-version-min 1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256

Ese par hace dos trabajos. Borrar una de las líneas deja a la otra imponiendo menos de lo que crees, y ese es justo el fallo que toda esta comprobación existe para atrapar.

El canal de datos es un cuarto control. data-ciphers negocia el cifrado simétrico dentro del túnel, y su resultado no dice nada sobre la versión de TLS del canal de control. Ver AES-256-GCM en el resumen de la sesión no es evidencia sobre TLS 1.3 en ningún sentido.

Lee show-tls como un inventario local

--show-tls enumera las suites que admite la biblioteca criptográfica con la que se enlazó este binario, por orden de preferencia. No es un informe de la puerta de enlace. El manual dice explícitamente que la lista procede de la biblioteca local, lo que significa que un portátil con OpenSSL 3.x y un router con una compilación más antigua imprimirán listas distintas mientras hablan con el mismo servidor.

EvidenceWhat it actually describes
--show-tls outputCapabilities of this client build and its library
Profile directivesWhat this attempt is allowed to offer
Session log lineWhat this one negotiation selected

Supón que un cliente admite las suites A, B y C y que una sesión elige B. Eso no establece nada sobre si el servidor permite A o C, ni sobre si B es su única opción permitida. Mantén las tres filas separadas y la mayoría de los hilos de TLS confusos se resolverán solos.

El inventario sigue mereciendo la pena conservarlo. Cuando una sesión falla, comparar la lista de la biblioteca con la del perfil te dice si el cliente tenía alguna posibilidad de ofrecer lo que quería el servidor. También muestra si un cambio de backend ha retirado en silencio TLS_CHACHA20_POLY1305_SHA256 del conjunto del que dependen los clientes más antiguos — el tipo de regresión que se manifiesta como un puñado de usuarios que no pueden conectarse mientras nadie más nota nada.

Pregúntale a la puerta de enlace algo que pueda responder

Si administras el servicio, inspecciona la configuración efectiva de la instancia en ejecución en lugar de un archivo en disco. Puede que OpenVPN se haya iniciado con otra ruta --config, que cargue inclusiones y que no se haya reiniciado desde la edición. La política del demonio en ejecución es la que encuentran los clientes.

Si no lo administras, pide al operador los requisitos de cliente admitidos o una prueba de aceptación acotada. Un intento rechazado no es automáticamente una suite rechazada: un límite inferior de versión, comprobaciones de identidad de certificado como remote-cert-tls, o un desajuste entre tls-auth y tls-crypt pueden terminar el intercambio antes de que la selección de suites importe. Lee el error del servidor antes de cambiar la lista del cliente, porque «handshake failed» cubre cuatro causas distintas y solo una de ellas es un desajuste de cifrado.

Apuntar openssl s_client al puerto VPN tampoco reproduce la pregunta. El canal de control funciona dentro del propio encapsulado de OpenVPN, así que una sonda TLS en crudo prueba un protocolo distinto en un puerto que espera otra cosa. Cualquier conclusión que se saque de ella es sobre la sonda, no sobre el túnel.

Registra dos resultados y mantenlos separados

Una sesión permitida reciente produce una línea del canal de control que nombra la versión del protocolo y el cifrado seleccionado, y una línea separada del canal de datos que nombra el cifrado del túnel. Captura ambas con la versión del cliente y el nombre del perfil, y anota qué instancia del servidor respondió:

openvpn --config office.ovpn --verb 4 2>&1 | tee session.txt

Luego lee las dos líneas de ese archivo en lugar de memoria. El par es la evidencia; un nombre de suite por sí solo es una preferencia, y el límite de versión es una afirmación separada sobre qué rechaza el servidor.

Ejecuta las comprobaciones en este orden. Confirma la compilación y el backend con --version. Captura --show-tls antes de cambiar nada. Enuncia el límite inferior de versión requerido por separado de la lista de suites. Confirma la política efectiva de la instancia en ejecución con su propietario. Observa una sesión permitida y, si el plan lo permite, un intento rechazado con una versión anterior. Registra los resultados del canal de control y del canal de datos como hallazgos separados.

Si un cliente requerido no puede cumplir un nuevo mínimo, toma esa decisión de migración o excepción de forma explícita en lugar de bajar en silencio una regla de aceptación no relacionada para que el despliegue parezca terminado.

Artículos relacionados