Je ne parviens pas à ajouter un certificat avec une clé de 2048 bits à un KeyStore Bouncy Castle. J'ai mis à jour ma version de JCE, les dossiers de sécurité JRE et JDK, avec UnlimitedJCEPolicyJDK7.zip. Le code ci-dessous indique l'emplacement de l'erreur. J'utilise bcprov-jdk15on-149 mais j'ai essayé bcprov-jdk15on-157 avec les mêmes résultats. Il y a un certain nombre de messages concernant les problèmes de chiffrement symétrique mais moins sur PKE. Je cours Windows 10 Pro, JRE 7, JDK 1.7.0_51. J'apprécierais toutes les suggestions.InvalidKeyException: taille de clé non valide BouncyCastle, mais pas la clé publique du fournisseur par défaut
char[] testPass = "changeit".toCharArray();
String testAlias = "express";
// -----------------------------------------------------------------
// Open source TrustStore and extract certificate and key
FileInputStream jksFis = new FileInputStream("G:\\testSrc.jks");
KeyStore jksKS = KeyStore.getInstance(KeyStore.getDefaultType());
jksKS.load(jksFis, testPass);
PrivateKey jksPK = (PrivateKey) jksKS.getKey(testAlias,testPass);
RSAKey rsaKey = (RSAKey)jksPK;
int rsaKeyLen = rsaKey.getModulus().bitLength();
System.out.printf("Key length is %d\n",rsaKeyLen); // 2048
X509Certificate[] jksCerts = new X509Certificate[1];
jksCerts[0] = (X509Certificate) jksKS.getCertificate(testAlias);
// -----------------------------------------------------------------
// Create new default type keystore and add certificate and key.
KeyStore jksDest = KeyStore.getInstance(KeyStore.getDefaultType());
jksDest.load(null,null);
jksDest.setKeyEntry(testAlias, jksPK, testPass, jksCerts);
FileOutputStream jfos = new FileOutputStream("G:\\testDest.jks");
jksDest.store(jfos, testPass);
jfos.close();
// -----------------------------------------------------------------
// Create Bouncy Castle KeyStore and add certificate and key
Security.addProvider(new BouncyCastleProvider());
KeyStore bksKS = KeyStore.getInstance("PKCS12","BC");
bksKS.load(null,null);
bksKS.setKeyEntry(testAlias, jksPK, testPass, jksCerts);
FileOutputStream bksFos = new FileOutputStream("G:\\testDest.bks");
// -----------------------------------------------------------------
// Next line gives this error:
// java.io.IOException: exception encrypting data -
// java.security.InvalidKeyException: Illegal key size
bksKS.store(bksFos, testPass); // This is the error line.
// Error on previous line.
La longueur de la clé RSA est pas le problème ici, il n'y a aucune restriction pour des longueurs de clés RSA en Java 7. Mais les clés symétriques sont utilisées pour le chiffrement du keystore et ceux qui sont différents pour JKS et PKCS12. Juste pour être sûr: Ajouter une vérification dans votre code pour la politique de force illimitée, sth. comme ceci: https://stackoverflow.com/a/11541337/2672392 – Omikron
Merci beaucoup, Omikron. J'ai suivi votre lien et posté les modifications résultantes au code dans ma réponse à ma question ci-dessous. – Will