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:
Paso 1: Configurar la instancia de CA : emita un almacén de claves de cliente RA y configure el acceso.
Paso 2: Configurar la instancia de RA : habilite la API de administración de certificados REST.
Paso 3: Configurar el servidor de archivos : cree un script para emitir varios certificados a la vez utilizando la API de administración de certificados REST y configure la supervisión de un directorio mediante systemd.
Paso 4: Probar la emisión masiva : cree un CSR PKCS #10 usando OpenSSL y pruebe la emisión de un certificado para asegurarse de que todo funcione correctamente.
Arquitectura
La configuración recomendada se muestra en la siguiente figura.

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.
Abra CA Web en la instancia de CA y haga clic en Roles y reglas de acceso .
Haga clic en Agregar para agregar un nuevo rol.
Edite las reglas de acceso para el rol recién creado:
Utilice Administradores de RA como plantilla de rol, seleccione la CA adecuada y el perfil de entidad final.
Borrar Aprobar Entidades Finales , Recuperar Clave Entidades Finales y Revocar Entidades Finales .
Registro de auditoría de vista clara.

Vaya al Modo avanzado y configure /administrador para permitir.
Agregue un nuevo miembro a este rol usando el DN de sujeto del certificado que creó en el paso anterior.

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.
Haga clic en Sistemas pares en el menú.
Haga clic en Solicitudes autorizadas para el conector de pares conectado a la RA.
Asegúrese de que esté habilitado el acceso al perfil de entidad final y CA apropiado.
En la sección Procesar solicitudes de protocolos , habilite REST .

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.
Haga clic en Perfiles de certificado en el menú.
Edite el perfil de certificado apropiado y habilite Permitir anulación de DN de sujeto por CSR en la sección Permisos .
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.
Vaya a la web de CA en la instancia de RA y haga clic en Configuración del sistema en el menú.
Haga clic en la pestaña Configuración del protocolo .
Habilitar la gestión de certificados REST .

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.
apt install curl jqSi está utilizando RHEL 8, debe agregar el repositorio EPEL para obtener acceso al paquete jq .
dnf install https: //dl .fedoraproject.org /pub/epel/epel-release-latest-8 .noarch.rpmyum install curl jq Crear directorios necesarios
Crea la siguiente estructura de carpetas:
/opt/ejbca-ra-plug/├── certificates├── csr├── failedLa 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:
Crea el siguiente script:
/opt/ejbca-ra-plug/ra.sh#!/bin/shhostname=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)"];doforfilein/opt/ejbca-ra-plug/csr/*.csr;do[ -e"$file"] ||continue# Use the CN in the CSR as the username of the end entityusername=$(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"\--argcp"$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-typeP12 \--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"-ne0 ];thenlogger"Failed to issue certificate for '$username'. cURL exited with exit code $exit_code."mv"$file"/opt/ejbca-ra-plug/failed/continuefiresponse=$(cat'/tmp/response.json')if["$http_code"-ne'201'];thenlogger"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/continueficertificate=$(cat'/tmp/response.json'| jq -r .certificate)if["$certificate"='null'];thenlogger"Failed to issue certificate for '$username'. No certificate found in response."logger"Response from server: $response"mv"$file"/opt/ejbca-ra-plug/failed/continuefifilename=$(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'."donedone⏎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.
Asegúrese de que el archivo sea ejecutable y sólo legible por root .
Establecer permisos para ra.shchmod700/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:
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.targetCree el archivo de servicio systemd.
/etc/systemd/system/ra.servicio[Unit]Description=EJBCA RA Service[Install]WantedBy=multi-user.target[Service]Type=oneshotExecStart=.sh/opt/ejbca-ra-plug/raComience a monitorear.
systemctl daemon-reloadsystemctl enable ra.path --now
Paso 4 - Prueba de emisión masiva
Para probar la emisión masiva, haga lo siguiente:
Para probar su script, cree una clave y una CSR utilizando OpenSSL.
Crear un CSR usando OpenSSLopenssl req -nodes -newkey rsa:2048 -keyouttest.key -outtest.csr -subj"/C=SE/O=PrimeKey Solutions AB/CN=Bulk Issuance Test"Mueva el CSR al directorio /opt/ejbca-ra-plug/csr .
Mover la RSEmvtest.csr/opt/ejbca-ra-plug/csr/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.
openssl pkcs12 - in /opt/ejbca-ra-plug/keystore .p12 -out /opt/ejbca-ra-plug/ca -cacerts .pem -cacerts -nokeysopenssl pkcs12 - in /opt/ejbca-ra-plug/keystore .p12 -out /opt/ejbca-ra-plug/cert -clcerts .pem -clcerts -nokeysopenssl pkcs12 - in .pem.tmp -nocerts .p12 -out /opt/ejbca-ra-plug/keystore /opt/ejbca-ra-plug/keyopenssl pkcs8 - in /opt/ejbca-ra-plug/key .pem .pem.tmp -out /opt/ejbca-ra-plug/keyrm -f /opt/ejbca-ra-plug/key .pem.tmpLuego 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