Quale parte della CSR è sottoposta a hash per creare la sua firma?

5

Vorrei cambiare il CSR prima che venga trasferito alla CA senza passare nuovamente attraverso il processo di creazione della CSR. Per farlo ho bisogno di sapere come calcolare la firma della CSR dopo che l'ho modificata. Purtroppo non sono riuscito a scoprire esattamente quanti byte del CSR sono stati sottoposti a hash.

Ho creato la CSR in questo modo:

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

Dopo

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

gli ultimi 256 byte (sha256WithRSAEncryption) di certrequest-stripped sono signature1. Ora mi piacerebbe sapere quanti dei primi byte di certrequest-stripped ho l'hash per firmare l'hash usando la chiave privata.

In altre parole, sto cercando il valore di "?" nel seguente comando in modo che entrambe le firme (firma1 e firma2) corrispondano :

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

So che il taglio deve essere da qualche parte dietro il campo ASN1 per l'esponente, ma dal momento che il mio tentativo di aumentare la testa del CSR byte per byte fallito, sono preoccupato che mi manca qualcosa di fondamentale qui.

    
posta jhscheer 26.05.2014 - 04:32
fonte

3 risposte

3

Ho trovato la risposta alla mia domanda e posta qui per riferimento.

Genera nuova coppia di chiavi e CSR

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

Modifica csr.der in modified_csr.der

Estrai la sequenza (che inizia con l'offset 4) del CSR che è hash per la firma

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

Crea nuova firma

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

Unisci modified_csr.der e 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

Verifica nuovo CSR

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

Converti CSR in PEM

openssl req -outform PEM -inform DER -in new_csr.der -out new_csr.pem
    
risposta data 27.05.2014 - 20:51
fonte
1

A parte: non è necessario convertire manualmente in binario (DER), openssl req -in req.pem -out req.der -outform der lo farà per te. Oppure potresti fare -outform der sulla creazione iniziale. Anche la tua formulazione suggerisce che la dimensione della firma a 256 byte abbia qualche connessione con il tuo utilizzo di SHA256 nell'algoritmo della firma, il che è falso. Suppongo tu capisca che se cambi la lunghezza di qualsiasi cosa nel corpo dovrai modificare tutti i campi di lunghezza di ASN.1 interessati, poiché il corpo deve essere DER.

Una CSR, come gli oggetti macro X.509 SIGNED strettamente correlati (cert e CRL), è una SEQUENZA ASN.1 di:

  • il corpo (per CSR una SEQUENZA di più cose)
  • un AlgorithmIdentifier che identifica l'algoritmo di firma (e teoricamente può includere parametri ma non lo fa mai, la stessa struttura in posti altri a volte fa); questa è una SEQUENZA di un OID (qui l'OID per sha256WithRSA) e NULL
  • un BIT STRING contenente la firma

openssl asn1parse -in req.der -inform der mostra la decodifica, con l'offset, la lunghezza dell'intestazione e la lunghezza del corpo di ciascuna parte; l'aggiunta di -i rende la struttura più chiara (dati di rientro basati sul livello). Si noti che la chiave pubblica non è esattamente l'ultima cosa nel corpo CSR. E il formato CSR può gestire altri tipi di chiavi rispetto a RSA, nel qual caso non esiste un 'esponente'.

Ma solo hash e poi rsautl -sign non ti daranno una firma PKCS # 1 corretta; non codifica il digest AlgId come richiesto. Vedi rsa hash crittografato == firma rsa . Puoi farlo a mano (come fa il modulo FSS di OpenSSL per salvare sul codice soggetto a costose verifiche) oppure puoi usare

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

EDIT: o un'altra opzione che ho ricordato; dalla 1.0.0:

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

ti consente di eseguire l'hash, ma codifica ASN.1 (assicurati di specificare lo stesso hash da codificare come hai usato per l'hash effettivo), padding e modexp.

    
risposta data 26.05.2014 - 11:35
fonte
0

La parte totale della CSR viene considerata mentre si esegue l'hashing, quindi se si cambia la parte di essa si verificherà il fallimento della verifica pop. È meglio ricreare il csr.

    
risposta data 27.05.2014 - 10:40
fonte

Leggi altre domande sui tag