web-dev-qa-db-fra.com

PKCS # 12: exception DerInputStream.getLength ()

Je génère un certificat à l'aide de la commande keytool:

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

Ensuite, si je tente de le charger à l'aide de l'API de sécurité Java, après avoir obtenu le fichier sous forme d'octet []:

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

Je reçois un DerInputStream.getLength (): lengthTag = 127, exception trop grosse.

Qu'est-ce qui ne va pas?

16
karlipoppins

J'ai eu ce problème et j'ai cherché dans les profondeurs de Google et je ne pouvais toujours pas trouver la réponse. Après quelques jours de lutte avec un code hérité de qualité terrible, j'ai trouvé la cause de cette erreur.

KeyStore.load(InputStream is, String pass);

cette méthode prend un InputStream et s'il y a un problème avec un tel InputStream, cette exception est levée, certains problèmes que j'ai rencontrés:

  • InputStream pointe sur le mauvais fichier/vierge/que vous venez de créer
  • InputStream est déjà ouvert ou quelque chose d'autre contient la ressource
  • Le InputStream était déjà utilisé et lu , ainsi la position de l'octet suivant de InputStream est sa fin

Le dernier était le responsable de mon problème. Le code créait un InputStream à partir d'un certificat et continuait à l'utiliser dans deux appels KeyStore.load (), le premier avait réussi, le second m'avait toujours généré cette erreur.

16
ibrabeicker

Le certificat que vous créez a probablement un caractère supplémentaire à la fin qui est interprété à tort comme un autre certificat. Utilisez une ou plusieurs lignes vides à la fin.

Référez-vous à: Java Certificate Parsing

8
Amanpreet

Pour les autres avec un problème similaire:

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

Pour moi, la solution consistait à supprimer le paramètre: -storetype pkcs12 Car le type standard est jks

5
Jan vO

Spécifiez le type de certificat dans le code , Par exemple:

System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
2
Harikrishnan P.R

Cela m'est arrivé car j'avais copié et collé le fichier .p12 localement sur mon ordinateur Windows 10. Aucune idée comment/pourquoi c'est un problème, mais lorsque je clone un projet qui contient des fichiers .p12 et que je pointe mon code vers eux, les fichiers fonctionnent. Cependant, copier et coller les fichiers dans l'Explorateur de fichiers Windows vers un autre emplacement du disque dur provoque cette erreur !!!!

0
Adam Hughes

Vous faites quelque chose de mal.
J'ai essayé votre commande, puis j'ai chargé la p12 parfaitement.
Le code suivant fonctionne: 

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

Je me demandais si vous mettiez la commande telle quelle, vous obtenez une erreur de keytool selon laquelle le mot de passe doit comporter au moins 6 caractères.
Vous n'avez pas eu cette erreur? Quelle version de Java utilisez-vous?
Remarque: si vous devez créer des certificats, vous pouvez également consulter cet outil.
http://sourceforge.net/projects/certhelper/

0
Cratylus

J'ai eu le même problème.

Ma solution est de remplacer PKCS12 par jceks dans la ligne ci-dessous car j’ai apparemment utilisé le mauvais type. 

KeyStore clientStore = KeyStore.getInstance("PKCS12");
0
sindacco