Guía de operaciones del CMP

A continuación se incluyen operaciones, configuraciones y flujos de trabajo que utilizan el Protocolo de administración de certificados (CMP).

Para obtener más información sobre CMP y cómo funciona con EJBCA, consulte la página de descripción general de CMP .

3GPP

Para operaciones y configuraciones específicas de 3GPP, consulte Operaciones 3GPP .

Comandos de muestra que utilizan CMP para OpenSSL

Inscripción en modo RA

cmpforopenssl funciona con EJBCA en modo RA con la siguiente configuración de EJBCA, utilizando por ejemplo el alias "opensslra" (configuraciones no mencionadas = predeterminadas):

CMP Operational Mode : RA Mode
CMP Response Protection : pbe
CMP Authentication Module : HMAC
CMP Authentication Parameters : password

Luego puedes usar cmpforopenssl (como RA):

$ . /openssl genrsa 2048 > key1.pem
$ . /openssl cmp -cmd ir -server localhost:8080 -path ejbca /publicweb/cmp/opensslra -srvcert ManagementCA.cacert.pem -ref NewUser -secret pass:password -certout clcert1.pem -newkey key1.pem -subject "/CN=NewUser/O=My Organization/C=SE"

Esto solicita un certificado, definiendo el DN del sujeto que se utilizará. La CA utilizada para firmar el certificado se especifica en la configuración de CMP de EJBCA y puede obtenerse del ID de clave. EJBCA autenticó la solicitud mediante la protección HMAC con la contraseña y acepta cualquier solicitud tras una autenticación correcta.

Puede solicitar claves generadas por el servidor omitiendo la clave pública en la solicitud de certificado, utilizando la misma solicitud que un ir, pero sin la clave pública. Sin embargo, tenga en cuenta que no se puede usar cmpclient, ya que ningún parámetro de cmpclient permite omitir la clave pública. Para obtener un ejemplo de código Java, consulte la clase de prueba CrmfRequestTest.test12ServerGeneratedKeys().

Para el tipo de solicitud p10cr:

Primero genere un CSR del tipo PKCS10 y el par de claves RSA utilizando el siguiente comando (el indicador de asunto no se admite en el caso de p10cr):

openssl req -new -newkey rsa:2048 -nodes -out cmptestp10cr.csr -keyout cmptestp10cr.key -subj "/C=SE/ST=Stockholm/L=Solna/O=My Org/OU=IT/CN=cmptestp10cr"

Luego use el siguiente comando openssl para obtener un certificado del backend cmp de EJBCA:

openssl cmp -cmd p10cr -server localhost:8080 -path ejbca /publicweb/cmp/opensslra -srvcert ManagementCA.cacert.pem -ref cmptestp10cr -secret pass:password -certout cmptestp10cr.pem -csr cmptestp10cr.csr

Tenga en cuenta que en el comando anterior, ref es el nombre común mencionado en el CSR y el secreto utilizado es de tipo contraseña y debe configurarse en el alias en consecuencia.

Revocar un certificado en modo RA

Para revocar un certificado emitido, la RA puede enviar una solicitud de revocación de CMP:

openssl cmp -cmd rr -server localhost:8080 -path ejbca /publicweb/cmp/opensslra -srvcert ManagementCA.cacert.pem -oldcert . /clcert1 .pem -secret pass:password -ref ffaabb

Tenga en cuenta que el valor de referencia es un valor aleatorio.

Inscripción en modo cliente con autenticación de contraseña HMAC

cmpforopenssl funciona con EJBCA en modo cliente, con autenticación de contraseña HMAC, utilizando la siguiente configuración de EJBCA con, por ejemplo, el alias "opensslclient" (configuraciones no mencionadas = predeterminadas):

CMP Authentication Module : HMAC
CMP Authentication Parameters : password
Extract Username Component : CN

Ahora puedes agregar un nuevo usuario en EJBCA:

$ bin /ejbca .sh ra addendentity user1 --password password "CN=user1,O=My Organization,C=SE" ManagementCA 1 USERGENERATED
$ bin /ejbca .sh ra setclearpwd user1 password
$ bin /ejbca .sh ra setendentitystatus user1 10

Luego puedes usar cmpforopenssl (como cliente):

$ . /openssl cmp -cmd ir -server localhost:8080 -path ejbca /publicweb/cmp/opensslclient -srvcert ManagementCA.cacert.pem -ref user1 -secret pass:password -certout clcert1.pem -newkey key1.pem -subject "/CN=user1/O=My Organization/C=SE"

Esto solicita un certificado, y el DN del sujeto solicitado debe coincidir con el DN del sujeto registrado. EJBCA autentica la solicitud mediante la protección HMAC con la contraseña del usuario registrado. Consulte la documentación de CMP anterior para obtener una configuración más avanzada.


En el caso de solicitudes p10cr (asumiendo que existe un nuevo usuario1 con estado GENERADO en EJBCA):

Primero cree un CSR PKCS#10 usando el siguiente comando:

openssl req -new -newkey rsa:2048 -nodes -out user1.csr -keyout user1.key -subj "/C=SE/ST=Stockholm/L=Solna/O=My Org/OU=IT/CN=user1"

Luego puede usar ese csr con el subcomando openssl p10cr para emitir un certificado de la siguiente manera:

openssl cmp -cmd p10cr -server localhost:8080 -path ejbca /publicweb/cmp/opensslclient -srvcert ManagementCA.cacert.pem -ref user1 -secret pass:password -certout user1p10cr.pem -csr user1.csr


Inscripción en modo cliente, autenticación de certificado de cliente

cmpforopenssl funciona con EJBCA en modo cliente, con autenticación de certificado, utilizando la siguiente configuración de EJBCA con el alias tex. "openssleec" (configuraciones no mencionadas = predeterminadas):

CMP Authentication Module : EndEntityCertificate
CMP Authentication Parameters : ManagementCA (use the CA that issues your client authentication certificate)
Extract Username Component : CN

Ahora puede emitir un certificado usando la autenticación de certificado en EJBCA (la entidad final necesita un certificado antes, por lo que reutilizamos el usuario1 de arriba):

$ bin /ejbca .sh ra setclearpwd user1 password
$ bin /ejbca .sh ra setendentitystatus user1 10

Luego puedes usar cmpforopenssl (como cliente):

$ . /openssl cmp -cmd ir -server localhost:8080 -path ejbca /publicweb/cmp/openssleec -srvcert ManagementCA.cacert.pem -cert clcert.pem -key key.pem -certout clcert1.pem -newkey key1.pem -subject "/CN=user1/O=My Organization/C=SE"

Esto solicita un certificado, y el DN del sujeto solicitado debe coincidir con el DN del sujeto registrado. EJBCA autentica la solicitud mediante la protección de firma con el certificado del usuario registrado. Consulte la documentación de CMP anterior para obtener una configuración más avanzada.

También puedes utilizar un 'cr' en lugar de un 'ir';

$ bin /ejbca .sh ra setendentitystatus user1 10
. /openssl cmp -cmd cr -server localhost:8080 -path ejbca /publicweb/cmp/openssleec -srvcert ManagementCA.cacert.pem -cert clcert.pem -key key.pem -certout clcert1.pem -newkey key1.pem -subject "/CN=user1/O=My Organization/C=SE"

En caso de mensaje p10cr, puede utilizar el siguiente comando openssl (establezca el estado del usuario1 nuevamente a 10 antes):

openssl cmp -cmd p10cr -server localhost:8080 -path ejbca /publicweb/cmp/openssleec -srvcert ManagementCA.cacert.pem -ref user1 -cert user1p10cr.pem -certout user1p10cr2.pem -csr user1.csr -key user1.key

user1.key es la clave utilizada para firmar el CSR original.

Inscripción del dispositivo con contraseña HMAC

Un flujo de trabajo PKI típico que utiliza CMP implica inscribir un dispositivo con un certificado y luego hacer que el dispositivo renueve automáticamente el certificado cuando esté a punto de vencer.

  1. Generar un par de claves.

  2. Inscripción inicial de certificado de cliente mediante un código de inscripción único.

  3. Generar un nuevo par de claves.

  4. Renovar con un nuevo certificado para el nuevo par de claves, autenticado utilizando el par de claves y el certificado antiguos.

Los pasos anteriores se pueden simular en la realidad utilizando el cliente openssl y cmpforopenssl , pero también utilizando el EJBCA cmpclient .

Esto funciona con un cmpalias predeterminado (llamado cmp) configurado con los parámetros:

CMP Authentication Module : HMAC
CMP Authentication Parameters : password
Extract Username Component : CN
  1. Generar un par de claves:

    $ . /openssl genrsa -out certs /cl_key .pem 2048
  2. Inscripción inicial:
    Antes de la inscripción inicial, agregue una nueva entidad final en EJBCA, en este ejemplo con el nombre de usuario cmptest y el DN de sujeto 'CN=cmptest', y el código de inscripción 'CMP-pwd' (se debe configurar una contraseña de texto sin cifrar para el usuario cmptest).

    openssl cmp -cmd ir -server localhost:8080 -path ejbca /publicweb/cmp/cmp -srvcert ManagementCA.cacert.pem -ref cmptest -secret pass:CMP- pwd -newkey certs /cl_key .pem -certout certs /cl_cert .pem -subject "/CN=cmptest"
  3. Generar un nuevo par de claves:

    $ . /openssl genrsa -out certs /cl_new_key .pem 2048
  4. Renovar con un nuevo certificado (el estado del usuario cmptest debe volver a ser 10 (NUEVO)):

    openssl cmp -cmd kur -server localhost:8080 -path ejbca /publicweb/cmp/cmp -srvcert ManagementCA.cacert.pem -key certs /cl_key .pem -cert certs /cl_cert .pem -newkey certs /cl_new_key .pem -certout certs /cl_new_cert .pem

    Para la actualización de clave del tipo de solicitud p10cr, primero genere un nuevo par de claves:

openssl genrsa -out certs /cl_new_key_p10cr .pem 2048

Establezca el estado del usuario cmptestp10cr (asumiendo que ya existe en EJBCA) nuevamente en NUEVO (10):

bin /ejbca .sh ra setendentitystatus cmptestp10cr 10

Y actualice las claves (obteniendo un nuevo certificado) usando el nuevo par de claves generado anteriormente con el siguiente comando:

openssl cmp -cmd kur -server localhost:8080 -path ejbca /publicweb/cmp/cmp -srvcert ManagementCA.cacert.pem -key cmptestp10cr.key -cert cmptestp10cr.pem -newkey certs /cl_new_key_p10cr .pem -certout p10cr_new_cert.pem


Manejo personalizado de solicitudes de certificados

Se puede añadir una clase de complemento personalizada para gestionar una solicitud de certificado. La clase que implementa este complemento debe implementar la interfaz org.ejbca.core.protocol.ExtendedUserDataHandler.

Para obtener más información, consulte Creación de procesadores de solicitudes personalizados.

Ejemplos de mensajes para clientes

Si bien existen muchos clientes CMP (como se indica en la página de descripción general de CMP ), muchos casos de uso requieren la creación de clientes personalizados. Utilizando las bibliotecas de cifrado de BouncyCastle , hemos creado algunas implementaciones de ejemplo en Java si necesita ayuda para empezar.

Para obtener más información, consulte Soporte al cliente de CMP .