Supongo que por CSR te refieres a Solicitud de certificado . Una solicitud de certificado es algo que debe enviarse a una Autoridad de certificación para que la CA la convierta en un Certificado . La solicitud debe contener todo lo que la CA necesita para eso, es decir, todo lo que la CA no puede inferir o generar por sí misma.
Una pieza crítica de un certificado es la clave pública . En una PKI , los dos emplazamientos habituales para la generación de pares de claves están en el solicitante o en la CA: ya sea el solicitante genera su propio par de claves y envía la parte pública a la CA como parte de su solicitud, o la CA genera el par de claves y enviará la clave privada al solicitante junto con el certificado. Supongo que te refieres a lo primero: tu "herramienta de generación de CSR" en realidad genera un par de claves y coloca la clave pública en una solicitud de certificado.
Hay varios formatos estándar para las solicitudes de certificado. Un formato muy común es PKCS # 10 . Si su problema implica una solicitud PKCS # 10 que contiene una clave pública, que debe extraerse, es "simplemente" una cuestión de ubicar la clave pública en el conjunto de bytes. PKCS # 10 utiliza ASN.1 , con las estructuras definidas en el RFC:
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
signature BIT STRING
}
CertificationRequestInfo ::= SEQUENCE {
version INTEGER { v1(0) } (v1,...),
subject Name,
subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
attributes [0] Attributes{{ CRIAttributes }}
}
SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {
algorithm AlgorithmIdentifier {{IOSet}},
subjectPublicKey BIT STRING
}
Entonces, la solicitud PKCS # 10 es un SEQUENCE
cuyo primer campo es una estructura CertificateRequestInfo
, otro SEQUENCE
cuyo tercer campo es un SubjectPublicKeyInfo
, que contiene la clave pública que está buscando. La clave pública consiste en un identificador para el tipo de clave y el valor de la clave codificada.
Tu tarea ahora es una cuestión de decodificación. El análisis de ASN.1 / DER con código personalizado es factible, pero requiere cuidado. Será mejor que uses una biblioteca existente que hará todo el trabajo por ti. OpenSSL puede ayudar; vea su función PEM_read_bio_X509_REQ()
para decodificar, luego X509_REQ_get_pubkey()
(aunque debe decirse que OpenSSL la documentación puede ser un poco desalentadora).
Un punto importante es que una clave pública es una colección de algunos objetos matemáticos, mientras que una función hash toma como entrada una secuencia de bits. Por lo tanto, para hacer un hash de la clave pública, debe ocurrir algún tipo de codificación, y si desea calcular el valor de hash correcto, debe codificar la clave en exactamente de la forma requerida por su situación ( diga que "debe proporcionar ... un hash SHA256 de la clave pública": supongo que tiene algún tipo de requisito formal que describe el formato exacto con toda la claridad necesaria).