Genera oggetto Keytool da CSR

1

Devo sviluppare un'applicazione che usi un'altra applicazione per generare una CSR. Dopo aver generato il CSR, devo fornire questo CSR insieme a un hash SHA256 della chiave pubblica di una CA. Il problema è che l'applicazione che genera il CSR non genera l'hash.

Come faccio a generare l'hashcode?

Posso creare un oggetto keystore utilizzando questo particolare CSR e quindi estrarre l'hash da esso?

O qualcuno può suggerire un'altra tecnica?

O non è possibile generare l'oggetto keystore da un CSR esistente?

    
posta DanMatlin 22.07.2013 - 16:08
fonte

1 risposta

0

Suppongo che per CSR intendi una richiesta di certificato . Una richiesta di certificato è qualcosa che deve essere inviata a una Autorità di certificazione in modo che la CA possa trasformarla in un certificato . La richiesta deve contenere tutto ciò di cui ha bisogno la CA, ovvero tutto ciò che la CA non può inferire o generare da solo.

Una parte fondamentale di un certificato è la chiave pubblica . In una PKI , le due posizioni abituali per la generazione della coppia di chiavi si trovano nel richiedente o nella CA: o il richiedente genera la propria coppia di chiavi e invia la parte pubblica alla CA come parte della sua richiesta, oppure la CA genera la coppia di chiavi e invierà la chiave privata al richiedente insieme al certificato. Presumo che tu intenda il primo: il tuo "strumento di generazione di CSR" genera effettivamente una coppia di chiavi e inserisce la chiave pubblica in una richiesta di certificato.

Esistono diversi formati standard per le richieste di certificati. Un formato molto comune è PKCS # 10 . Se il tuo problema riguarda effettivamente una richiesta PKCS # 10 contenente una chiave pubblica, che deve essere estratta, allora è "solo" una questione di localizzare la chiave pubblica nel gruppo di byte. PKCS # 10 utilizza ASN.1 , con le strutture definite nella 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
}

Quindi la richiesta PKCS # 10 è una SEQUENCE il cui primo campo è una struttura CertificateRequestInfo , un'altra SEQUENCE il cui terzo campo è un SubjectPublicKeyInfo , che contiene la chiave pubblica che stai cercando. La chiave pubblica consiste in un identificatore per il tipo di chiave e il valore della chiave codificata stessa.

Il tuo compito ora è una questione di decodifica. L'analisi di ASN.1 / DER con codice personalizzato è fattibile, ma richiede attenzione. Faresti meglio ad usare alcune librerie esistenti che faranno tutto il lavoro duro per te. OpenSSL può aiutarti; vedere la sua funzione PEM_read_bio_X509_REQ() per la decodifica, quindi X509_REQ_get_pubkey() (anche se bisogna dire che OpenSSL la documentazione può essere un po 'scoraggiante).

Un punto importante è che una chiave pubblica è una raccolta di pochi oggetti matematici, mentre una funzione di hash prende come input una sequenza di bit. Quindi, per poter cancellare la chiave pubblica, deve avvenire una sorta di codifica, e se vuoi calcolare il giusto valore di hash, devi codificare la chiave in esattamente come richiesto dalla tua situazione (tu Dite che "dovete fornire ... un hash SHA256 della chiave pubblica": suppongo che abbiate una sorta di requisito formale che descrive il formato esatto con tutta la chiarezza necessaria).

    
risposta data 22.07.2013 - 17:33
fonte

Leggi altre domande sui tag