En los sistemas de infraestructura de clave pública (PKI), una solicitud de firma de certificado ( CSR o solicitud de certificación ) es un mensaje enviado por un solicitante a una autoridad de certificación de la infraestructura de clave pública (PKI) con el fin de solicitar un certificado de identidad digital . La CSR suele contener la clave pública para la que se debe emitir el certificado, información de identificación (como un nombre de dominio) y una prueba de autenticidad que incluye protección de integridad (por ejemplo, una firma digital). El formato más común para las CSR es la especificación PKCS #10 ; otros incluyen el formato de mensaje de solicitud de certificado (CRMF) más capaz [1] y el formato SPKAC (Signed Public Key and Challenge) generado por algunos navegadores web .
Antes de crear un CSR para un certificado X.509 , el solicitante primero genera un par de claves , manteniendo en secreto la clave privada de ese par, por ejemplo:
# https://www.openssl.org/docs/manmaster/man1/openssl-genrsa.html# "openssl genrsa" crea una clave privada RSA:$ openssl genrsa -out 2024_wikipedia.org.key
La CSR contiene información que identifica al solicitante (como un nombre distintivo ), la clave pública elegida por el solicitante y posiblemente más información. Cuando se utiliza el formato PKCS #10, la solicitud debe estar autofirmada utilizando la clave privada del solicitante , que proporciona una prueba de posesión de la clave privada pero limita el uso de este formato a claves que se pueden utilizar para (alguna forma de) firma. La CSR debe ir acompañada de una prueba de origen (es decir, prueba de identidad del solicitante) que es requerida por la autoridad de certificación, y la autoridad de certificación puede ponerse en contacto con el solicitante para obtener más información.
Información típica requerida en un CSR (columna de muestra de certificado X.509 ). Tenga en cuenta que a menudo existen alternativas para los nombres distinguidos (DN); se indica el valor preferido.
Esta línea de comando de muestra utiliza los detalles que se enumeran en la tabla anterior:
# https://www.openssl.org/docs/manmaster/man1/openssl-req.html# "openssl req" crea una solicitud de firma:$ openssl req -sha512 -new -subj "/C=US/ST=California/L=San Francisco/O=Wikimedia Foundation, Inc./CN=*.wikipedia.org" -key 2024_wikipedia.org.key -out 2024_wikipedia.org.csr
Si la solicitud tiene éxito, la autoridad certificadora enviará un certificado de identidad firmado digitalmente utilizando la clave privada de la autoridad certificadora.
Una solicitud de certificación en formato PKCS #10 consta de tres partes principales: la información de la solicitud de certificación, un identificador de algoritmo de firma y una firma digital en la información de la solicitud de certificación. La primera parte contiene la información importante, incluida la clave pública. La firma del solicitante evita que una entidad solicite un certificado falso de la clave pública de otra persona. [3] Por lo tanto, la clave privada es necesaria para producir una CSR PKCS #10, pero no es parte de la CSR. [4]
El CSR para certificados de identificación personal y certificados de firma debe tener la dirección de correo electrónico del titular de la identificación o el nombre de la organización en el caso de una identificación comercial.
La primera parte, de tipo ASN.1 CertificationRequestInfo , consta de un número de versión (que es 0 para todas las versiones conocidas, 1.0, 1.5 y 1.7 de las especificaciones), el nombre del sujeto, la clave pública (identificador del algoritmo + cadena de bits) y una colección de atributos que proporcionan información adicional sobre el sujeto del certificado. Los atributos pueden contener las extensiones de certificado requeridas, una contraseña de desafío para restringir las revocaciones, así como cualquier información adicional sobre el sujeto del certificado, posiblemente incluyendo tipos locales o futuros. [3]
El estándar PKCS#10 define un formato binario para codificar CSR para su uso con X.509 . Se expresa en ASN.1 . A continuación, se muestra un ejemplo de cómo se puede examinar su estructura ASN.1 mediante OpenSSL :
openssl asn1parse -i -in su_solicitud.p10
Un CSR puede representarse como un PKCS#10 codificado en Base64 ; a continuación se ofrece un ejemplo:
-----INICIAR SOLICITUD DE CERTIFICADO----- MIICzDCCAbQCAQAwgYYxCzAJBgNVBAYTAkVOMQ0wCwYDVQQIDARub25lMQ0wCwYD VQQHDARub25lMRIwEAYDVQQKDAlXaWtpcGVkaWExDTALBgNVBAsMBG5vbmUxGDAW BgNVBAMMDyoud2lraXBlZGlhLm9yZzEcMBoGCSqGSIb3DQEJARYNbm9uZUBub25l LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMP/U8RlcCD6E8AL PT8LLUR9ygyygPCaSmIEC8zXGJung3ykElXFRz/Jc/bu0hxCxi2YDz5IjxBBOpB/ kieG83HsSmZZtR+drZIQ6vOsr/ucvpnB9z4XzKuabNGZ5ZiTSQ9L7Mx8FzvUTq5y /ArIuM+FBeuno/IV8zvw Ae/VRa8i0QjFXT9vBBp35aeatdnJ2ds50yKCsHHcjvtr 9/8zPVqqmhl2XFS3Qdqlsprzbgksom67OobJGjaV+fNHNQ0o/rzP//Pl3i7vvaEG 7Ff8tQhEwR9nJUR1T6Z7ln7S6cOr23YozgWVkEJ/dSr6LAopb+cZ88FzW5NszU6i 57HhA7ECAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4IBAQBn8OCVOIx+n0AS6WbEmYDR SspR9xOCoOwYfamB+2Bpmt82R01zJ/kaqzUtZUjaGvQvAaz5lUwoMdaO0X7I5Xfl sllMFDaYoGD4Rru4s8gz2qG/QHWA8uPXzJVAj6X0olbIdLTEqTKsnBj4Zr1AJCNy /YcG4ouLJr140o26MhwBpoCRpPjAgdYMH60BYfnc4/DILxMVqR9xqK1s98d6Ob/+ 3wHFK+S7BRWrJQXcM8veAexXuk9lHQ+FgGfD0eSYGz0kyP26Qa2pLTwumjt+nBPl rfJxaLHwTQ/1988G0H35ED0f9Md5fzoKi5evU1wG5WRxdEUPyt3QUXxdQ69i0C+7 -----FIN DE LA SOLICITUD DE CERTIFICADO-----
La estructura ASN.1 de la solicitud de firma de certificado anterior (tal como la analiza openssl) aparece de la siguiente manera, donde el primer número es el desplazamiento de bytes, d=profundidad, hl=longitud del encabezado del tipo actual, l=longitud del contenido:
0:d=0 hl=4 l= 716 cons: SECUENCIA 4:d=1 hl=4 l= 436 cons: SECUENCIA 8:d=2 hl=2 l= 1 prim: ENTERO :00 11:d=2 hl=3 l= 134 cons: SECUENCIA 14:d=3 hl=2 l= 11 contras: CONJUNTO 16:d=4 hl=2 l= 9 cons: SECUENCIA 18:d=5 hl=2 l= 3 prim: OBJETO :nombredelpais 23:d=5 hl=2 l= 2 prim: PRINTABLESTRING :EN 27:d=3 hl=2 l= 13 contras: CONJUNTO 29:d=4 hl=2 l= 11 cons: SECUENCIA 31:d=5 hl=2 l= 3 prim: OBJETO :nombreDeEstadoOProvincia 36:d=5 hl=2 l= 4 prim: UTF8STRING :ninguno 42:d=3 hl=2 l= 13 contras: CONJUNTO 44:d=4 hl=2 l= 11 cons: SECUENCIA 46:d=5 hl=2 l= 3 prim: OBJETO :nombrelocalidad 51:d=5 hl=2 l= 4 prim: UTF8STRING :ninguno 57:d=3 hl=2 l= 18 contras: CONJUNTO 59:d=4 hl=2 l= 16 cons: SECUENCIA 61:d=5 hl=2 l= 3 prim: OBJETO :nombreOrganización 66:d=5 hl=2 l= 9 prim: UTF8STRING :Wikipedia 77:d=3 hl=2 l= 13 contras: CONJUNTO 79:d=4 hl=2 l= 11 cons: SECUENCIA 81:d=5 hl=2 l= 3 prim: OBJETO :nombreDeUnidadOrganizacional 86:d=5 hl=2 l= 4 prim: UTF8STRING :ninguno 92:d=3 hl=2 l= 24 contras: CONJUNTO 94:d=4 hl=2 l= 22 cons: SECUENCIA 96:d=5 hl=2 l= 3 prim: OBJETO :nombrecomún 101:d=5 hl=2 l= 15 prim: UTF8STRING :*.wikipedia.org 118:d=3 hl=2 l= 28 contras: CONJUNTO 120:d=4 hl=2 l= 26 cons: SECUENCIA 122:d=5 hl=2 l= 9 prim: OBJETO :dirección de correo electrónico 133:d=5 hl=2 l= 13 prim: IA5STRING :[email protected] 148:d=2 hl=4 l= 290 cons: SECUENCIA 152:d=3 hl=2 l= 13 cons: SECUENCIA 154:d=4 hl=2 l= 9 prim: OBJETO :rsaEncryption 165:d=4 hl=2 l= 0 prim: NULO 167:d=3 hl=4 l= 271 prim: CADENA DE BITS 442:d=2 hl=2 l= 0 contras: cont [ 0 ] 444:d=1 hl=2 l= 13 cons: SECUENCIA 446:d=2 hl=2 l= 9 prim: OBJETO :md5ConCifradoRSA 457:d=2 hl=2 l= 0 prim: NULO 459:d=1 hl=4 l= 257 prim: CADENA DE BITS
Esto se generó al proporcionar la codificación base64 en el comando , donde PEM ( Privacy-Enhanced Mail ) es la codificación de las reglas de codificación distinguida ASN.1 en base64.openssl asn1parse -in your_request.p10 -inform PEM -i