El mensaje dice que OpenVPN no puede cargar un certificado incrustado, y el nombre de archivo que tiene en la cabeza dice lo contrario. Lo que recibió el analizador importa más que lo que contiene el sistema de archivos, porque la directiva cert acepta dos tipos de valor completamente distintos. Uno es una ruta que abre; el otro es texto PEM que llegó dentro de la configuración. Hasta que sepa qué forma recibió el cliente en ejecución, cada arreglo es una conjetura.

Dos formas de almacenamiento, una directiva

Las directivas cert, key y ca aceptan cada una una ruta o un bloque incrustado. Cuando el valor es una ruta, OpenVPN abre ese archivo y lee el objeto del disco. Cuando la configuración contiene un bloque delimitado por etiquetas cert, la misma directiva consume en su lugar el contenido entre esas etiquetas, y no interviene ningún archivo aparte.

Ambas formas producen al final el mismo tipo de objeto, por eso un despliegue que funciona puede pasar de una a otra sin ningún otro cambio. Un perfil que lleva un certificado de cliente y una clave privada incrustados es autosuficiente, y copiarlo a otra máquina funciona sin copiar también un directorio de certificados.

Lo contrario no es cierto. Dejar client.crt junto a un perfil que incrusta sus propios datos no cambia nada, porque nada en la configuración hace referencia a ese archivo. Es la razón más habitual por la que un archivo que existe claramente parece ignorarse.

Cómo se convierte un bloque incrustado en un objeto

El contenido incrustado se extrae de la configuración y se entrega al analizador PEM como texto. Ese analizador espera los límites habituales: una línea BEGIN, una carga base64 y una línea END correspondiente. Si el bloque se truncó por una copia fallida, lo envolvió en HTML una página de descarga o se abrió en un editor que normalizó los guiones, el analizador falla en un contenido que parece presente.

<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>

Por eso también la redacción del error es engañosa. La palabra incrustado describe dónde miró el cargador, no qué encontró allí. Un archivo nombrado en una configuración y un objeto incrustado en ella pueden producir la misma queja cuando los bytes subyacentes son inservibles.

Compruebe qué forma usa realmente el perfil cargado, no qué archivo abrió por casualidad su editor:

grep -nE '^(ca|cert|key) |^<(ca|cert|key)>' client.ovpn

Cómo se resuelve una referencia de ruta

Un valor de ruta se abre en relación con el directorio de trabajo del cliente, no con el directorio que contiene la configuración. Bajo systemd ese directorio de trabajo es lo que establezca la unidad, y una ejecución interactiva desde su shell hereda algo completamente distinto. Por eso el mismo archivo de configuración puede funcionar cuando lo prueba a mano y fallar como servicio.

Las rutas relativas heredan la misma ambigüedad. Cuando vea un nombre de archivo suelto, pregunte cuál es el directorio actual del proceso en producción en lugar de suponer que coincide con su terminal.

Para un certificado almacenado por separado, un análisis sin conexión confirma el objeto antes de depurar cualquier cosa por encima:

openssl x509 -in client.crt -noout -subject -issuer -dates
openssl pkey -in client.key -noout -check

Esos comandos demuestran que los archivos son legibles y estructuralmente válidos. No demuestran que el par confíe en el emisor, que el certificado siga dentro de su ventana de validez o que la clave le corresponda.

Qué puede y qué no puede decirle el error del analizador

Un fallo de análisis localiza el problema en una entrada y una etapa. No le dice cuál de las dos formas de almacenamiento usó el cliente, ni le dice si el objeto habría sido aceptado. Son preguntas separadas con pruebas separadas.

Una vez que el análisis tiene éxito, el siguiente fallo pertenece a una etapa posterior. Un rechazo de confianza, una discrepancia de propósito o una discrepancia de clave los informa el par o la capa TLS, no el cargador. Sustituir el mismo archivo una y otra vez no moverá ese error.

Mantenga la mitad sensible fuera de los informes públicos mientras investiga. Comparta los nombres de las directivas, el texto del error y la estructura del bloque, con el material de clave y cualquier carga identificativa eliminados. El manual openvpn(8) documenta ambas formas de las directivas de archivo y el comportamiento del directorio de trabajo que hay detrás.

Artículos relacionados