2011-09-13 15 views
11

ho generare un certificato utilizzando il comando keytool:PKCS # 12: DerInputStream.getLength() eccezione

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12 

Poi se provo a caricarlo utilizzando API di sicurezza di Java, dopo aver ottenuto il file come un byte [] :

KeyStore ks = KeyStore.getInstance("PKCS12"); 
try{ 
    ks.load(new ByteArrayInputStream(data), "test".toCharArray()) 
} catch (Exception e){ 
    ... 
} 

Ottengo un DerInputStream.getLength(): lengthTag = 127, un'eccezione troppo grande.

Cosa c'è che non va?

risposta

10

Ho avuto questo problema e ho cercato nelle profondità di Google e ancora non riuscivo a trovare la risposta. Dopo alcuni giorni di lotta con un terribile codice legacy di qualità, ho scoperto che cosa stava causando questo errore.

KeyStore.load(InputStream is, String pass); 

Questo metodo richiede un InputStream e se c'è qualche problema con tale InputStream, questa viene generata un'eccezione, alcuni problemi che ho incontrato:

  • I punti InputStream al sbagliata/bianco/solo file creato
  • l'InputStream è già aperta o qualcos'altro sta tenendo la risorsa
  • L'InputStream è stato già utilizzato e leggere, così la posizione del byte successivo di InputStream è la fine

L'ultimo era il responsabile del mio problema. Il codice stava creando un InputStream da un certificato e procedendo a utilizzarlo in due chiamate KeyStore.load(), il primo ha avuto esito positivo, il secondo mi ha sempre segnalato questo errore.

+0

Grazie. Il messaggio di errore è davvero fuorviante. Nel mio caso 'data' (la chiave) era un array di byte vuoto e questo ha causato questo errore. E tutto perché ho riutilizzato il flusso di input. – Stroboskop

+2

La prima causa che fai notare è IMO la causa più comune: file normalmente sbagliato. cioè a volte mi capita quando provo ad usare un file di archivio di chiavi 'JKS' con un' KeyStore.getInstance ("PKCS12") 'o reversal':) '. – albciff

7

Probabilmente il certificato che hai creato ha un carattere extra alla fine che viene erroneamente interpretato come un altro certificato. Utilizzare una o più righe vuote alla fine.

consultare: Java Certificate Parsing

+0

Sì, ho verificato già perché avevo un errore simile su un certificato x509 ma non è quello. Grazie per la tua risposta, io lo faccio +1 perché potrebbe essere stato il problema. – karlipoppins

+1

Sembra che il collegamento sia morto. –

+0

@AniketThakur: ho corretto il collegamento. Puoi farvi riferimento ora. – Amanpreet

0

si sta facendo qualcosa di sbagliato.
Ho provato il tuo comando e poi ho caricato il p12 bene.
Il seguente codice funziona:

FileInputStream fin = new FileInputStream("..\\test.p12"); 
KeyStore ks = KeyStore.getInstance("PKCS12"); 
ks.load(fin, "123456".toCharArray()); 
System.out.println(ks.getCertificate("myrsakey")); 

Mi chiedevo se si mette il comando come è che si ottiene un errore da keytool che la password deve essere di almeno 6 caratteri.
Non hai ricevuto questo errore? Quale versione di java stai usando?
Nota: se è necessario creare certificati, è anche possibile esaminare questo strumento.
http://sourceforge.net/projects/certhelper/

3

per gli altri con un problema simile:

"keystore load: DerInputStream.getLength(): lengthTag=109, too big." 

Per me soluzione era quella di rimuovere il param: -storetype pkcs12 poiché il tipo standard è JKS

-1

Specificare il tipo di certificato nel codice per esempio :

System.setProperty("javax.net.ssl.trustStoreType", "jks"); 
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
0

Ho avuto lo stesso problema.

La mia soluzione è di sostituire PKCS12 con jceks nella riga sottostante perché stavo apparentemente usando il tipo sbagliato.

KeyStore clientStore = KeyStore.getInstance("PKCS12"); 
Problemi correlati