Inicio sesión

Inicio sesión

Estoy ejecutando un servidor OpenVPN para algunos dispositivos IoT y muchos de esos dispositivos necesitan que se reemplacen sus certificados porque los antiguos caducan. La actualización de esos certificados es un proceso manual frágil que utiliza conexiones móviles lentas y, además, se puede acceder a esos dispositivos únicamente mediante OVPN. Por este motivo, quiero asegurarme de que los certificados se hayan reemplazado correctamente y de que se establezcan nuevas conexiones utilizándolos. El problema es que no puedo encontrar una manera sencilla de obtener suficientes detalles de OVPN para, por ejemplo, ver las publicaciones seriadas o la hora de emisión de los certificados reemplazados.

Entonces, ¿cómo registrar detalles de los certificados para cada conexión en OpenVPN?

Lo mejor sería alguna columna adicional en el registro de estado, pero incluso--estado-versión 2No parece proporcionar ningún detalle adicional de los certificados. Cosas como el nombre común de los certificados son los mismos entre los antiguos y los nuevos. ¿Existe alguna compatibilidad con columnas personalizadas adicionales basadas en datos disponibles internamente?

Además, aumenté el nivel de registro hasta 9, pero además de registrar muchas cosas relacionadas con paquetes de bajo nivel, tampoco vi ningún detalle de certificados adicionales de los clientes. Sin embargo, dependiendo del nivel de registro, es fácil pasar por alto cosas, por lo que de todos modos sería preferible algo que registre solo esos detalles del certificado.

Los conceptos como --client-connecty --learn-addressparecen proporcionar también nombres comunes únicamente. Además, debido a que las cosas son solo de interés temporal, me gustaría evitar implementar algún software demasiado personalizado para este caso.

¡Gracias!

Respuesta1

En realidad, mi pregunta contiene dos partes: cómo registrar algo de interés y cómo lograr mi objetivo de asegurarme de que ya no se utilice ningún certificado antiguo. Entonces la respuesta también difiere.

Inicio sesión

Si bien no encontré una configuración simple para registrar detalles adicionales como números de serie de certificados, eso se puede implementar de forma personalizada con la ayuda de--tls-verificar. Eso espera un script y para ese script OVPN establece múltiples variables de entorno, por ejemplo, que contienen el número de serie de algún certificado.

–tls-verificar cmdEjecute el comando cmd para verificar el nombre X509 de una conexión TLS pendiente que, de otro modo, ha pasado todas las demás pruebas de certificación (excepto la revocación mediante la directiva –crl-verify; la prueba de revocación se produce después de –tls-verifytest).

Las variables de entorno admitidas:

tls_id_{n}
tls_serial_{n}
tls_serial_hex_{n}

Si bien no es estrictamente un registro, --tls-export-certtambién podría ser de interés, porque hace que el certificado completo de algún cliente esté disponible en el servidor para un análisis detallado en teoría.

–directorio tls-export-certAlmacene los certificados que utilizan los clientes al conectarse a este directorio. Esto se hará antes de llamar a –tls-verify. Los certificados utilizarán un nombre temporal y se eliminarán cuando regrese el script tls-verify. El nombre del archivo utilizado para el certificado está disponible a través de la variable de entorno peer_cert.

Rechazar certificados no válidos

Mi objetivo final es asegurarme de que un certificado reemplazado se utilice como se espera. Una forma de hacerlo es utilizar una lista de revocación de certificados y OVPN admite una forma muy sencilla de hacerlo: no se necesita ningún formato de archivo concreto ni nada parecido con los certificados, sino que simplemente se pueden agregar algunos nombres de archivos a algún directorio configurado y todos los certificados. que contienen el número de serie correspondiente a algún nombre de archivo están bloqueados. Lo más importante a tener en cuenta es que los nombres de los archivos deben ser números de serie certificados en escritura decimal; todo lo demás es bastante sencillo.

–crl-verificar crl ['dir']Verifique el certificado de pares con el archivo crl en formato PEM.[...]Si se especifica el indicador dir opcional, habilite un modo diferente donde crl sea un directorio que contenga archivos nombrados como números de serie revocados (los archivos pueden estar vacíos, el contenido es nunca leer). Si un cliente solicita una conexión, donde el número de serie del certificado del cliente (cadena decimal) es el nombre de un archivo presente en el directorio, será rechazada.

server.confsimplemente contiene la siguiente configuración adicional:

crl-verify 'crl' 'dir'

Que se asigna al siguiente directorio:

crl
    7
    8
    9
crl_staging
    12
    13
    14
openvpn-status.log
server.conf

Los archivos en crly crl_stagingson simplemente las series de certificados decimales y se pueden mover entre directorios según sea necesario. Si hay un serial disponible en crl, la conexión se bloquea; de lo contrario, se realiza correctamente. Un mensaje de error de ejemplo en los registros se parece al siguiente:

ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS: new session incoming connection from [AF_INET]34.252.35.124:35231 (via [AF_INET][...]%eth1)
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY OK: depth=1, C=DE, ST=[...], O=[...], OU=[...], CN=[...], emailAddress=[...]
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY CRL: certificate serial number 10 is revoked
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 OpenSSL: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS_ERROR: BIO read tls_read_plaintext error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS object -> incoming plaintext read error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS handshake failed

información relacionada