Emitir varios certificados a la vez utilizando una gran cantidad de CSR

Uno de los casos de uso de EJBCA es la creación de una gran cantidad de certificados, dada una gran cantidad de CSR PKCS #10. Para lograrlo, debe integrarse con una de las API de EJBCA para la inscripción de certificados mediante un script. Esta guía utiliza la API de gestión de certificados REST de EJBCA, que permite la inscripción de certificados mediante el envío de cargas JSON a EJBCA.

Con esta guía aprenderá a hacer lo siguiente:

Arquitectura

La configuración recomendada se muestra en la siguiente figura.

imágenes/descargar/archivos adjuntos/93590485/RA_Setup.png

Esta configuración consta de los siguientes componentes:

  • Un módulo de seguridad de hardware que almacena la clave privada de la CA.

  • Una instancia de RA que ejecuta EJBCA y actúa como proxy entre el servidor de archivos y la CA.

  • Una instancia de CA que ejecuta EJBCA. La CA se conecta a la RA mediante un conector de pares.

  • Un firewall en el perímetro de la zona de seguridad de la CA que protege a la CA del mundo exterior.

  • Un servidor de archivos Linux que almacena las nuevas CSR y los certificados que se distribuirán. El servidor de archivos realiza solicitudes a la instancia de RA mediante la API de gestión de certificados REST de EJBCA.

Paso 1: Configurar la instancia de CA

Comience configurando la instancia de CA de acuerdo con las siguientes instrucciones.

Emitir almacén de claves del cliente RA

Debe emitir un almacén de claves de cliente de RA al servidor de archivos. Este almacén de claves se utiliza para autenticarse en la instancia de RA al realizar llamadas a la API REST.

Emita el almacén de claves utilizando la siguiente configuración:

Uso de la clave

Firma digital

Uso extendido de la clave

Autenticación del cliente

Formato

P12

Tome nota del DN del sujeto del certificado, ya que será necesario en el siguiente paso.

Configurar el acceso del cliente RA

A continuación, otorgue al certificado de cliente de RA acceso para realizar funciones de RA en la CA. Para ello, cree un nuevo miembro de rol en EJBCA.

  1. Abra CA Web en la instancia de CA y haga clic en Roles y reglas de acceso .

  2. Haga clic en Agregar para agregar un nuevo rol.

  3. Edite las reglas de acceso para el rol recién creado:

    1. Utilice Administradores de RA como plantilla de rol, seleccione la CA adecuada y el perfil de entidad final.

    2. Borrar Aprobar Entidades Finales , Recuperar Clave Entidades Finales y Revocar Entidades Finales .

    3. Registro de auditoría de vista clara.

      imágenes/descargar/archivos adjuntos/93590485/ra_clients.png
  4. Vaya al Modo avanzado y configure /administrador para permitir.

  5. Agregue un nuevo miembro a este rol usando el DN de sujeto del certificado que creó en el paso anterior.

    imágenes/descargar/archivos adjuntos/93590485/ra_client_members.png

Permitir llamadas a la API REST a través de pares

A continuación, configure la función del conector de pares para permitir el procesamiento de llamadas API REST.

  1. Haga clic en Sistemas pares en el menú.

  2. Haga clic en Solicitudes autorizadas para el conector de pares conectado a la RA.

  3. Asegúrese de que esté habilitado el acceso al perfil de entidad final y CA apropiado.

  4. En la sección Procesar solicitudes de protocolos , habilite REST .
    imágenes/descargar/archivos adjuntos/93590485/solicitudes_autorizadas.png

  5. Haga clic en "Roles y reglas de acceso" en el menú y edite las reglas de acceso para el rol de conector de pares que utiliza la instancia de RA en el modo avanzado. Configure la regla de acceso " /administrador" como "permitir".

Configurar el perfil del certificado

La única forma de proporcionar un DN de sujeto al enviar CSR mediante la API de gestión de certificados REST es incluir esta información en la CSR. Sin embargo, aparte de la clave pública, la información de la CSR se ignora por defecto. Para usar el DN de sujeto de la CSR en el certificado, debe habilitar la opción "Permitir anulación de DN de sujeto por CSR" en el perfil del certificado.

  1. Haga clic en Perfiles de certificado en el menú.

  2. Edite el perfil de certificado apropiado y habilite Permitir anulación de DN de sujeto por CSR en la sección Permisos .
    imágenes/descargar/archivos adjuntos/93590485/permisos.png

Paso 2: Configurar la instancia de RA

Una vez configurada la instancia de CA, configure la instancia de RA según las siguientes instrucciones.

Habilitar la API de administración de certificados REST

La API de administración de certificados REST está deshabilitada de forma predeterminada, pero se puede habilitar en la configuración del sistema.

  1. Vaya a la web de CA en la instancia de RA y haga clic en Configuración del sistema en el menú.

  2. Haga clic en la pestaña Configuración del protocolo .

  3. Habilitar la gestión de certificados REST .

    imágenes/descargar/archivos adjuntos/93590485/configuración_del_protocolo.png

Paso 3: Configurar el servidor de archivos

Por último, cree los scripts necesarios en el servidor de archivos para realizar la inscripción masiva.

Instalar dependencias

Las siguientes instrucciones utilizan cURL para realizar la llamada a la API REST y jq para crear cargas útiles JSON.

En distribuciones basadas en Debian, estos paquetes se pueden instalar directamente usando apt.

Instalar dependencias en Debian
apt install curl jq

Si está utilizando RHEL 8, debe agregar el repositorio EPEL para obtener acceso al paquete jq .

Instalar dependencias en RHEL
dnf install https: //dl .fedoraproject.org /pub/epel/epel-release-latest-8 .noarch.rpm
yum install curl jq

Crear directorios necesarios

Crea la siguiente estructura de carpetas:

Estructura de carpetas para el complemento RA
/opt/ejbca-ra-plug/
├── certificates
├── csr
├── failed

La carpeta de certificados contendrá todos los certificados emitidos y la carpeta de solicitudes de certificado (CSR) contendrá las CSR que se enviarán a la CA. Una vez procesada una CSR, se elimina si el certificado correspondiente se emitió correctamente o se guarda en la carpeta de certificados fallidos si no se pudo emitir por algún motivo.

Transferir el almacén de claves al servidor de archivos

Transfiera el almacén de claves keystore.p12 que emitió anteriormente y colóquelo en el directorio /opt/ejbca-ra-plug .

Crear script para emisión masiva

Para crear el script para la emisión masiva, haga lo siguiente:

  1. Crea el siguiente script:

    /opt/ejbca-ra-plug/ra.sh
    #!/bin/sh
    hostname =
    port=
    client_cert= "/opt/ejbca-ra-plug/keystore.p12:foo123"
    cert_profile_name=
    ee_profile_name=
    ca_name=
    while [ "$(ls -A /opt/ejbca-ra-plug/csr)" ]; do
    for file in /opt/ejbca-ra-plug/csr/ *.csr; do
    [ -e "$file" ] || continue
    # Use the CN in the CSR as the username of the end entity
    username=$(openssl req - in ${ file } -inform PEM -noout -subject -nameopt multiline | sed -n 's/ *commonName *= //p' )
    password= "foo123"
    csr=$( cat ${ file })
    template= '{"certificate_request":$csr, "certificate_profile_name":$cp, "end_entity_profile_name":$eep, "certificate_authority_name":$ca, "username":$ee, "password":$password}'
    json_payload=$(jq -n \
    --arg csr "$csr" \
    --arg cp "$cert_profile_name" \
    --arg eep "$ee_profile_name" \
    --arg ca "$ca_name" \
    --arg ee "$username" \
    --arg password "$password" \
    "$template" )
    http_code=$(curl -X POST -s \
    -o '/tmp/response.json' \
    -w '%{http_code}' \
    --cert- type P12 \
    --cert "$client_cert" \
    -H 'Content-Type: application/json' \
    --data "$json_payload" \
    "https://$hostname:$port/ejbca/ejbca-rest-api/v1/certificate/pkcs10enroll" )
    exit_code= "$?"
    if [ "$exit_code" - ne 0 ]; then
    logger "Failed to issue certificate for '$username'. cURL exited with exit code $exit_code."
    mv "$file" /opt/ejbca-ra-plug/failed/
    continue
    fi
    response=$( cat '/tmp/response.json' )
    if [ "$http_code" - ne '201' ]; then
    logger "Failed to issue certificate for '$username'. Server returned HTTP status code $http_code."
    logger "Response from server: $response"
    mv "$file" /opt/ejbca-ra-plug/failed/
    continue
    fi
    certificate=$( cat '/tmp/response.json' | jq -r .certificate)
    if [ "$certificate" = 'null' ]; then
    logger "Failed to issue certificate for '$username'. No certificate found in response."
    logger "Response from server: $response"
    mv "$file" /opt/ejbca-ra-plug/failed/
    continue
    fi
    filename=$( basename "$file" .csr)
    echo '-----BEGIN CERTIFICATE-----' > "/opt/ejbca-ra-plug/certificates/$filename.pem"
    echo "$certificate" >> "/opt/ejbca-ra-plug/certificates/$filename.pem"
    echo '-----END CERTIFICATE-----' >> "/opt/ejbca-ra-plug/certificates/$filename.pem"
    rm "$file"
    logger "Succesfully issued certificate for '$username'."
    done
    done
  2. Establezca el nombre de host, el puerto, la contraseña del almacén de claves, el nombre de la entidad final y el perfil del certificado, y el nombre de la CA que firma el certificado.

  3. Asegúrese de que el archivo sea ejecutable y sólo legible por root .

    Establecer permisos para ra.sh
    chmod 700 /opt/ejbca-ra-plug/ra .sh

Configurar la monitorización mediante Systemd

A continuación, configure la supervisión del directorio CSR para emitir un nuevo certificado automáticamente cada vez que coloque un CSR en el directorio /opt/ejbca-ra-plug/csr .

Para monitorear el directorio usando systemd, haga lo siguiente:

  1. Cree el script de monitoreo de systemd.

    /etc/systemd/system/ra.path
    [Unit]
    Description=EJBCA RA Plug
    [Path]
    DirectoryNotEmpty= /opt/ejbca-ra-plug/csr
    [Install]
    WantedBy=multi-user.target
  2. Cree el archivo de servicio systemd.

    /etc/systemd/system/ra.servicio
    [Unit]
    Description=EJBCA RA Service
    [Install]
    WantedBy=multi-user.target
    [Service]
    Type=oneshot
    ExecStart= .sh /opt/ejbca-ra-plug/ra
  3. Comience a monitorear.

    systemctl daemon-reload
    systemctl enable ra.path --now

Paso 4 - Prueba de emisión masiva

Para probar la emisión masiva, haga lo siguiente:

  1. Para probar su script, cree una clave y una CSR utilizando OpenSSL.

    Crear un CSR usando OpenSSL
    openssl req -nodes -newkey rsa:2048 -keyout test .key -out test .csr -subj "/C=SE/O=PrimeKey Solutions AB/CN=Bulk Issuance Test"
  2. Mueva el CSR al directorio /opt/ejbca-ra-plug/csr .

    Mover la RSE
    mv test .csr /opt/ejbca-ra-plug/csr/
  3. El certificado ahora debería estar disponible en el directorio /opt/ejbca-ra-plug/certificates .

Solución de problemas

Comprobar el Syslog

Los errores se escriben en syslog.

> journalctl -xe
-- Unit ra.service has begun starting up.
Nov 23 20:43:04 rhel8 root[2657]: Failed to issue certificate for 'Bulk Issuance Test' . cURL exited with el código exit code 60.
Nov 23 20:43:04 rhel8 systemd[1]: Started EJBCA RA Service.
-- Subject: Unit ra.service has finished start-up
-- Defined-By: systemd
/support .redhat.com -- Support: https: //access
--
-- Unit ra.service has finished starting up.

En este ejemplo, cURL falló con el código de salida 60 , lo que significa que el certificado del servidor TLS de la instancia de RA no es de confianza. Si encuentra este problema, importe el emisor al almacén de confianza del servidor de archivos.

Habilitar el registro detallado en cURL

Puede ejecutar cURL con -v para un registro más detallado.

Utilice archivos PEM en lugar de PKCS #12

Algunas versiones anteriores de cURL no admiten archivos PKCS #12. En ese caso, puede dividir el archivo PKCS #12 en un certificado de cliente, un certificado de CA y una clave privada.

Dividir el archivo PKCS #12 usando OpenSSL
openssl pkcs12 - in /opt/ejbca-ra-plug/keystore .p12 -out /opt/ejbca-ra-plug/ca -cacerts .pem -cacerts -nokeys
openssl pkcs12 - in /opt/ejbca-ra-plug/keystore .p12 -out /opt/ejbca-ra-plug/cert -clcerts .pem -clcerts -nokeys
openssl pkcs12 - in .pem.tmp -nocerts .p12 -out /opt/ejbca-ra-plug/keystore /opt/ejbca-ra-plug/key
openssl pkcs8 - in /opt/ejbca-ra-plug/key .pem .pem.tmp -out /opt/ejbca-ra-plug/key
rm -f /opt/ejbca-ra-plug/key .pem.tmp

Luego especifique estos archivos cuando ejecute cURL:

pem_password=
curl -X POST -s \
-o '/tmp/response.json' \
-w '%{http_code}' \
--cacert '/opt/ejbca-ra-plug/ca.pem' \
--key '/opt/ejbca-ra-plug/key.pem' \
--cert "/opt/ejbca-ra-plug/cert.pem:$pem_password" \
-H 'Content-Type: application/json' \
--data "$json_payload" \
"https: // $ hostname /ejbca/ejbca-rest-api/v1/certificate/pkcs10enroll