¿Qué parte de la CSR es hash para crear su firma?

5

Me gustaría cambiar la CSR antes de transferirla a la CA sin pasar por el proceso de creación de la CSR nuevamente. Para hacerlo, necesito saber cómo calcular la firma de la CSR después de que la modifiqué. Desafortunadamente, no pude averiguar exactamente cuántos bytes de la CSR están hasheados.

Creé la CSR así:

openssl req -out certrequest.csr -new -newkey rsa:2048 -nodes -keyout private.key

Después

sed -e '1d' -e '$d' certrequest.csr | openssl enc -base64 -d > certrequest-stripped

los últimos 256 bytes (sha256WithRSAEncryption) de certrequest-stripped son signature1. Ahora me gustaría saber cuántos de los primeros bytes de certrequest despojados tengo el hash para firmar el hash usando la clave privada.

En otras palabras, estoy buscando el valor de "?" en el siguiente comando para que ambas firmas (firma1 y firma2) coincidan :

head -c <?> certrequest-stripped | openssl dgst -sha256 > hash
openssl rsautl -sign -inkey private.key -keyform PEM -in hash > signature2

Sé que el corte debe estar en algún lugar detrás del campo ASN1 para el exponente, pero dado que mi intento de aumentar el encabezado del byte a byte de CSR falló, me preocupa que me esté perdiendo algo fundamental aquí.

    
pregunta jhscheer 26.05.2014 - 04:32
fuente

3 respuestas

3

Descubrí la respuesta a mi pregunta y la publico aquí como referencia.

Generar par de claves nuevas y CSR

openssl req -out csr.der -new -newkey rsa:2048 -nodes -keyout privateKey.der -outform DER

Modificar csr.der a modified_csr.der

Extraiga la secuencia (que comienza en el desplazamiento 4) de la CSR que está codificada para la firma

openssl asn1parse -in modified_csr.der -inform der -strparse 4 -out part_of_CSR_thats_hashed

Crear nueva firma

openssl dgst -sha256 -sign privateKey.der -out new_signature part_of_CSR_thats_hashed

Combinar modified_csr.der y new_signature a new_csr.der

head -c $(( $(stat -c '%s' modified_csr.der) - 256 )) modified_csr.der > new_csr.der
cat new_signature >> new_csr.der

Verificar nueva CSR

openssl req -in new_csr.der -inform DER -noout -text -verify

Convertir CSR a PEM

openssl req -outform PEM -inform DER -in new_csr.der -out new_csr.pem
    
respondido por el jhscheer 27.05.2014 - 20:51
fuente
1

Aparte: no es necesario convertir manualmente a binario (DER), openssl req -in req.pem -out req.der -outform der lo hará por usted. O podrías hacer -outform der en la creación inicial. También su redacción sugiere que el tamaño de la firma de 256 bytes tiene alguna conexión con su uso de SHA256 en el algoritmo de firma, lo cual no es cierto. Y asumo que entiende que si cambia la longitud de cualquier cosa en el cuerpo, tendrá que cambiar todos los campos de longitud ASN.1 afectados, ya que el cuerpo debe ser DER.

Una CSR, como los objetos de macro SIGNED X.509 (cert y CRL) estrechamente relacionados, es una SECUENCIA ASN.1 de:

  • el cuerpo (para CSR una SECUENCIA de varias cosas)
  • un AlgorithmIdentifier que identifica el algoritmo de firma (y teóricamente puede incluir parámetros pero nunca lo hace; la misma estructura en otros lugares a veces sí lo hace); esta es una SECUENCIA de un OID (aquí el OID para sha256WithRSA) y NULL
  • una cadena de bits que contiene la firma

openssl asn1parse -in req.der -inform der le muestra la decodificación, con el desplazamiento, la longitud del encabezado y la longitud del cuerpo de cada parte; agregar -i hace que la estructura sea más clara (indentación de los datos según el nivel). Tenga en cuenta que la clave pública no es lo último en el cuerpo de CSR. Y el formato CSR puede manejar otros tipos de claves diferentes a RSA, en cuyo caso no hay un "exponente".

Pero solo el hash y luego rsautl -sign no le darán una firma PKCS # 1 correcta; no codifica el extracto de AlgId como se requiere. Consulte rsa hash == rsa signature . Puede hacerlo a mano (como lo hace el módulo OpenSSL FIPS para ahorrar en el código sujeto a una verificación costosa) o puede usar

openssl dgst -sha256 -sign rsaprivatekey.pem -in actual_data_not_hash -out sigvalue

EDITAR: u otra opción que recordé; desde la 1.0.0:

openssl pkeyutl -sign -inkey rsapriv -pkeyopt digest:sha256 -in hashval -out sigval

le permite hacer el hash, pero hace la codificación ASN.1 (asegúrese de especificar el mismo hash que se codificará como usó para el hash real), el relleno y el modexp.

    
respondido por el dave_thompson_085 26.05.2014 - 11:35
fuente
0

La parte total de la CSR se considera mientras se realiza el hash, por lo tanto, si cambias una parte, haremos que la verificación del pop falle. Es mejor volver a crear el CSR.

    
respondido por el user45475 27.05.2014 - 10:40
fuente

Lea otras preguntas en las etiquetas