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?
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:
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.
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
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
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");
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 !!!!
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/
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");