Validadores de posprocesamiento
El validador de certificados de comando externo permite validar la emisión en función de otros valores de certificado después de que el certificado (o eventual precertificado) se haya generado pero no emitido, almacenado ni publicado.
Tipos de validadores
Validador de certificados de comando externo
El Validador de Certificados de Comandos Externos permite llamar a un script externo para el certificado generado. El código de salida de la llamada externa determina si la validación ha fallado. Esto puede usarse no solo para validar los criterios del certificado, sino también para llamar a otros comandos o scripts externos. El usuario que ejecuta el servidor de aplicaciones EJBCA requiere los permisos del sistema de archivos del sistema operativo para hacerlo.
Para poder ver y editar el Validador de scripts externos, se debe habilitar el acceso a scripts externos activando Habilitar acceso a scripts externos en Configuración del sistema → Scripts externos .
El primer token del campo Comando externo debe ser el comando o script externo llamado, seguido de sus argumentos, separados por espacios. El certificado se almacena como un archivo temporal en el servidor EJBCA y su ruta completa se utiliza como primer argumento. Todos los argumentos posteriores se desplazan a la derecha. Si se utiliza el marcador de posición %cert% como argumento en cualquier posición, el certificado no se almacena en el sistema de archivos del servidor EJBCA. En su lugar, se elimina el marcador de posición y el certificado codificado en PEM se envía al comando o script externo mediante STDIN.
La plataforma para MS Windows y Unix/Linux se detecta automáticamente y se configuran el comando de shell y las opciones de shell predeterminados:
MS Windows: cmd.exe /C
Unix/Linux: /bin/sh -c
A continuación se muestran ejemplos de comandos externos para plataformas Unix/Linux:
$ /usr/local/opt/script .sh -param1 -param2$ /usr/local/opt/script .sh -param1 -param2 %cert%$ openssl x509 -text -noout - in %cert% Listado de permisos de script
Un administrador puede restringir la ejecución de scripts por razones de seguridad configurando una lista de permitidos en la pestaña "Scripts externos" de la configuración del sistema. Esta lista debe contener las rutas de todos los scripts que el Validador de Certificados de Comandos Externos puede ejecutar. Si un administrador habilita la lista de permitidos, EJBCA impedirá la ejecución de scripts que no estén explícitamente incluidos en ella.
Si un administrador habilitó la Lista de permitidos de scripts externos y un validador intenta ejecutar un comando que no está en la lista de permitidos, se lleva a cabo la acción "El validador no era aplicable".
La lista de permitidos tiene el siguiente formato: cada línea contiene la ruta completa del script permitido. Las líneas que empiezan por el carácter # se consideran comentarios. La lista de permitidos puede contener cualquier número de scripts. Una lista de permitidos vacía (habilitada) bloqueará la ejecución de todos los scripts externos.
A continuación se muestra un ejemplo de una lista de permitidos sintácticamente válida:
# ----------------------------------------------------------------------- # This is an example, this configuration does not necessarily make sense # ----------------------------------------------------------------------- /bin/echo # X.509 Certificate Linter by Amazon # https://github.com/awslabs/certlint /opt/certlint/certlint /opt/certlint/cablint # X.509 Certificate Linter based on CA/B Forum Baseline Requirements and RFC 5280 # https://github.com/zmap/zlint /opt/scripts/zLint.sh #/opt/scripts/IAmDisabled.shEsta lista de permitidos permite la ejecución de los scripts /opt/certlint/certlint , /opt/certlint/cablint y /opt/scripts/zLint.sh . No hay restricciones sobre los parámetros que se pueden introducir en estos scripts. La validación de la entrada debe realizarse en el propio script.
Ejemplo de certificado Lint
Puede utilizar el Validador de certificados de comando externo para ejecutar una verificación de pelusa en los certificados emitidos y cancelar la emisión si los certificados no pasan las pruebas.
Preparativos:
Primero, para habilitar scripts externos, seleccione CA UI → Configuración del sistema → Scripts externos :
Para habilitar el acceso a scripts externos, seleccione Activar
En la lista de permitidos de Configurar scripts, seleccione " Usar la lista de permitidos a continuación" y especifique una ruta completa. Por ejemplo, /opt/bin/zlint.sh .
Para agregar un Validador de Certificado de Comando Externo, vaya a Navegadores :
En Tipo de validador, seleccione Validador de certificado de comando externo .
En "Ruta completa del script" , agregue la ruta completa del script, terminada en %cert% . Por ejemplo, /opt/bin/zlint.sh %cert%.
Asegúrese de que al menos las opciones Error en código de error de script y Error de cierre de sesión estén seleccionadas.
Para habilitar el validador para la CA, vaya a Autoridades de certificación, haga clic en Editar y seleccione el Validador para la CA.
Emita un certificado usando un perfil de certificado de servidor. Puede ver la activación del validador en el archivo server.log. Para comprobar si hay fallos, configure el uso de clave en "Inicio de sesión de certificado de clave" en el perfil de certificado utilizado para emitir el certificado de entidad final. Esta opción no está permitida en los requisitos básicos del foro CAB. Para obtener más información, consulte "Uso de clave en los campos del perfil de certificado" .
ZLint
ZLint es un depurador de certificados X.509 que se puede descargar y crear desde la página de inicio de ZLint .
Debe envolver zlint en un script zlint.sh para permitir que el script devuelva un código de salida 0 en caso de éxito y 1 como código de salida en caso de error.
Coloque el script zlint.sh en la misma ubicación que ZLint:
#!/bin/shmydir= "$(dirname " $(realpath "$0" ) ")"OUTPUT=`$mydir/zlint -pretty <& 0 |grep - 1 '"error"' `#echo Output:\"$OUTPUT\"if [ -z "$OUTPUT" ]; thenecho "No error in zlint"exit 0elseecho "Error in zlint"echo $OUTPUT >& 2exit 1fiPruebe emitiendo un certificado con y sin la opción Uso de clave establecida en Firma de certificado de clave y vea la salida del registro en server.log y en el registro de auditoría de seguridad.
X509Pelusa
X509Lint es un depurador de certificados escrito en C, disponible para descargar en GitHub .
X509Lint espera que la ruta a un certificado codificado en PEM se pase como primer argumento. Dado que EJBCA escribe un certificado codificado en DER en el disco, es necesario analizar el certificado en PEM antes de invocar el linter. También es necesario analizar la salida para garantizar que EJBCA no pueda emitirlo si se produce un error. El siguiente script de contenedor utiliza OpenSSL para convertir el certificado en PEM y redirige los mensajes de error a la salida de error estándar.
#!/bin/sh# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# x509lint wrapper script for EJBCA.# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# INSTRUCTIONS: Put this script (x509lint.sh) together# with the x509lint binary in the directory ${BIN} and# create a new External Command Certificate Validator# in EJBCA with the following settings:# Full pathname of script: ${BIN}/x509lint.sh# Fail on script error code: true# Fail on output to error out: true# Issuance phase should be "Pre-certificate Validation"# if CT is being used, and "Certificate Validation"# otherwise.mydir=$( dirname "$(realpath " $0 ")" )pem= "/dev/shm/OpenSSL-$(date +%s%N).pem"openssl x509 - in "$1" -inform DER -out "$pem" -outform PEMif ! output=`$mydir /x509lint "$pem" `; then rm -f "$pem" exit 1firm -f "$pem"fatals=$( echo "$output" | grep 'F: ' )errors=$( echo "$output" | grep 'E: ' )warnings=$( echo "$output" | grep 'W: ' )notices=$( echo "$output" | grep 'N: ' )infos=$( echo "$output" | grep 'I: ' )bugs=$( echo "$output" | grep 'B: ' )if [ ! -z "$fatals" ]; then>&2 echo "$fatals"fiif [ ! -z "$errors" ]; then>&2 echo "$errors"fiif [ ! -z "$warnings" ]; then echo "$warnings"fiif [ ! -z "$notices" ]; then echo "$notices"fiif [ ! -z "$infos" ]; then echo "$infos"fiif [ ! -z "$bugs" ]; then echo "$bugs"fi Comprobaciones de claves débiles de Debian
Debido a un problema ( CVE-2008-0166 ) de 2006 en OpenSSL, donde una versión vulnerable de la biblioteca solo usaba el PID como semilla al generar claves RSA o DSA, un atacante puede encontrar la clave privada a partir de la clave pública correspondiente sin mayor esfuerzo. La versión defectuosa de OpenSSL se distribuyó en dos paquetes Debian entre el 17 de septiembre de 2006 y el 13 de mayo de 2008.
El proyecto Debian creó listas de bloqueo, que se pueden descargar desde:
https://packages.debian.org/jessie/openssl-blacklist ( RSA-1024, RSA-2048)
https://packages.debian.org/jessie/openssl-blacklist-extra ( RSA-512, RSA-4096)
https://packages.debian.org/jessie/openssh-blacklist ( DSA-1024, RSA-2048)
https://packages.debian.org/jessie/openssh-blacklist-extra ( DSA-2048, RSA-1024, RSA-4096)
https://packages.debian.org/jessie/openvpn-blacklist ( claves compartidas RSA de OpenVPN)
Puede comprobar los certificados con estas listas de bloqueo antes de su emisión extrayendo todas las listas de bloqueo y utilizando un script simple para verificar la presencia de la clave en una de ellas.
Para comprobar los certificados con las listas de bloqueo, haga lo siguiente:
Extraiga las listas de bloqueo de huellas dactilares en un solo directorio y cambie el nombre de los archivos de los paquetes para mantenerlos todos en un solo directorio en el servidor CA (el directorio /opt/weak-keys en el siguiente script de ejemplo):
blacklist-openssh.DSA-1024blacklist-openssh.DSA-2048blacklist-openssh.RSA-1024blacklist-openssh.RSA-2048blacklist-openssh.RSA-4096blacklist-openssl.RSA-512blacklist-openssl.RSA-1024blacklist-openssl.RSA-2048blacklist-openssl.RSA-4096blacklist-openvpn.RSA-2048Agregue el siguiente script al directorio como /opt/weak-keys/weak-key-check.sh (el nombre y el parche se pueden cambiar editando el script para adaptarlo a su entorno).
#!/bin/sh#echo $1OUTPUT=`grep $(openssl x509 -noout -pubkey -inform DER -in $1\| openssl rsa -pubin -noout -modulus \| sha1sum | cut -d' '-f1| cut -c21-) \/opt/weak-keys/all-lists/blacklist*`if[ -z"$OUTPUT"]; thenecho"Key is not in block list"exit0elseecho"Key is in block list"echo $OUTPUT >&2exit1fiEn el Validador de comandos externos, especifique lo siguiente:
Ruta completa del script : /opt/weak-keys/weak-key-check.sh.
Error en el código de error de script : verdadero.
Error en la salida de error : verdadero.
La fase de emisión debe ser una validación del certificado previa a la firma para garantizar que se realicen comprobaciones antes de utilizar la clave privada de la CA.
Guardar el validador.
No es fácil encontrar ejemplos de claves débiles sin generarlas usted mismo. Puede probar el script editando de nuevo el validador, cargando el siguiente certificado descargado de https://crt.sh/?id=2531502044 en la ruta de prueba del certificado y haciendo clic en "Probar comando" .
-----BEGIN CERTIFICATE-----MIIFzDCCA7SgAwIBAgIQB66bp3FYMWG3OiIbZKgNPzANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjEeMBwGA1UEAwwVU1NMLmNvbSBSU0EgU1NMIHN1YkNBMB4XDTIwMDMwNDAwMjczNVoXDTIwMDYwMjAwMjczNVowFzEVMBMGA1UEAwwMbGViZXJnZXIuYml6MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+TYH57WzTTfARNmo/Vx8/TGHD774iWbQoglRH+RGeFjgjoDGongoYr9jDwwXc1QxK36fojJ5zmDxIsvn/CsIRBj1aWCWvJons4LGfvEEmnZWuyhWleLKxmTvgbFbVMyLe+3fsuKjrktntuhpK75GXkpcErKS/3aGFY3UbMDp5qmGTZfZbXUAOTBq6Uvj6SyyeGrxrR+xRFAYCrB80ilLL2XlZ9hjqXge7qhhSxP5JYcVG4Fr8BvwhzoQ9zV1tdEuU6E+nZlvA6m4Qm4pQByCMMRH2BoqBL4n1aR1fNu+WdWHMC3uVmq2P5WZNsYKgdccVMmlHGVfRbhC1wuCty4QUwIDAQABo4IBwDCCAbwwHwYDVR0jBBgwFoAUJhR+4NzXpvfi1AQn32HxwuznMsowfAYIKwYBBQUHAQEEcDBuMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3LnNzbC5jb20vcmVwb3NpdG9yeS9TU0xjb20tU3ViQ0EtU1NMLVJTQS00MDk2LVIxLmNydDAgBggrBgEFBQcwAYYUaHR0cDovL29jc3BzLnNzbC5jb20wKQYDVR0RBCIwIIIMbGViZXJnZXIuYml6ghB3d3cubGViZXJnZXIuYml6MFEGA1UdIARKMEgwCAYGZ4EMAQIBMDwGDCsGAQQBgqkwAQMBATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5zc2wuY29tL3JlcG9zaXRvcnkwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly9jcmxzLnNzbC5jb20vU1NMY29tUlNBU1NMc3ViQ0EuY3JsMB0GA1UdDgQWBBTCxWii5RK9474UxOJBwLerjO2QbTAOBgNVHQ8BAf8EBAMCBaAwEwYKKwYBBAHWeQIEAwEB/wQCBQAwDQYJKoZIhvcNAQELBQADggIBAA+2tsRNgQIQMs93Q+NNCQgzj+9avNUbT8s1hZHBkoyf3zGgMRJgZkJ/xSEG/www/0SXKhhg8Bnp6r4PfpGn5t+T1XkZz8PhMvQlCT/zPBqC8W7voCSMdG0klWqz2hBJ3lNzEmHLKrkp63SM17xE8rGDd0oMfjKwxZKwb7z40jrAisEUWNq6FzSPiNllNJq7IbOffEuR0/oz21a3vruPJGB0opWYPBqQcLzemnEXDPEZR2NzfSZB5UzZfAtGLbjxYoMXK+7JLoQjsPpQWlJqGjVaHd9K+Lthg1THwYtdMekKFlobw8WirkmuKBZEmo8x6nobfFh2VaBOjA8AXRr6jEO3EjwKvCHDm32td9SkDXe7tP4IO/gJma4dxWKV1Hyu/1/6qPUVn55XCCAiuyZcDo3A0t0nSIR8iGbyBtQb0OJHSzOyGFJ2SLM8lmyl3eJzXc5YLcJso4S2ZVgZQ9KVApitjvlBvgL7BPskNZxI/c0TISPlOeYtD0O/rxQuQakWOqal9hk+l4Rrd7O+UguXijB92h/40AfLsaLUCRxBZgXAtSMLQNleqFMpxIwA93Ybm+iT3FmBqqDNZ2cJ77NTVL3sKeF77b0Xdppn+93Rz51zK9UmDRX973f9qi9p/1PbofcOBKZnMaFp7O7kXfdBRaXzslhSLDE2/X+Kx7SVe0GV-----END CERTIFICATE-----El resultado debería indicar " Probar salida : Código de salida: 1STDOUT: La clave está en la lista de bloqueos. ERROUT:(nombre de la lista de bloqueos y huella digital coincidente)". Al cargar otro certificado que no esté en la lista de bloqueos, el código de salida debería ser 0.
A continuación se muestra un ejemplo de configuración.

Validador de comandos externo para comprobar claves débiles