2011-09-13 24 views
11

que genera un certificado mediante el comando keytool:PKCS # 12: DerInputStream.getLength() excepción

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

Entonces si trato de cargarlo utilizando la API de seguridad de Java, después de conseguir el archivo como un byte [] :

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

me siento un DerInputStream.getLength(): lengthTag = 127, demasiado grande excepción.

¿Qué pasa?

Respuesta

10

Tuve este problema y he buscado en las profundidades de google y todavía no he podido encontrar la respuesta. Después de algunos días luchando con un código heredado de calidad terrible, encontré lo que estaba causando este error.

KeyStore.load(InputStream is, String pass); 

Este método toma un InputStream y si hay cualquier problema con tales InputStream, se lanza esta excepción, algunos problemas que he encontrado:

  • Los puntos InputStream a la equivocada/blanco/solo archivo creado
  • el InputStream ya está abierto o algo más está sosteniendo el recurso
  • el InputStream ya se utilizaba y leer, por tanto, la posición del siguiente byte de InputStream es su final

El último fue el responsable de mi problema. El código creaba un InputStream a partir de un certificado y procedía a usarlo en dos llamadas a KeyStore.load(), el primero fue exitoso, el segundo siempre me dio este error.

+0

Gracias. El mensaje de error es realmente engañoso. En mi caso 'data' (la clave) era una matriz de bytes vacía y eso causó este error. Y todo porque reutilicé el flujo de entrada. – Stroboskop

+2

La primera causa que señala es IMO, la causa más común: archivo normalmente incorrecto. es decir, a veces me sucede cuando trato de usar un archivo de almacén de claves 'JKS' con' KeyStore.getInstance ("PKCS12") 'o reversión':) '. – albciff

7

Probablemente el certificado que cree tiene un carácter adicional al final que se malinterpreta como otro certificado. Use una o más líneas en blanco al final.

Consulte: Java Certificate Parsing

+0

Sí ya comprobado ya que tenía un error similar en un certificado X509, pero eso no es todo. Gracias por su respuesta, la haré +1 porque podría haber sido el problema. – karlipoppins

+1

Parece que el enlace está muerto. –

+0

@AniketThakur: he reparado el enlace. Puede consultarlo ahora. – Amanpreet

0

Usted está haciendo algo mal.
Intenté su comando y luego cargué el p12 sin problemas.
El siguiente código funciona:

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

Me preguntaba si se pone el comando tal como se obtiene un error de la herramienta de claves que la contraseña debe tener al menos 6 caracteres.
¿No recibió ese error? ¿Qué versión de Java estás usando?
Nota: si necesita crear certificados, también puede consultar esta herramienta.
http://sourceforge.net/projects/certhelper/

3

Para otros con un problema similar:

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

Para mi solución fue eliminar el param: -storetype pkcs12 ya que el tipo estándar es jks

-1

Especifica el tipo de certificado en el código por ejemplo, :

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

Tuve el mismo problema.

Mi solución es reemplazar PKCS12 con jceks en la línea de abajo porque al parecer estaba usando un tipo incorrecto.

KeyStore clientStore = KeyStore.getInstance("PKCS12"); 
Cuestiones relacionadas