2017-06-17 2 views
0

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. 
+1

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

+0

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

Répondre

0

La procédure d'installation la mise à jour semble assez simple JCE si un de mes hypothèses sur la version J'utilise peut se tromper. Comme Omikron l'a souligné dans son commentaire utile, cela n'aurait pas dû avoir d'importance. Il m'a fait aller dans la bonne direction qui a conduit à la solution. Je poste le code révisé ci-dessous. Je ne sais pas pourquoi le type de magasin de clés par défaut a fonctionné en premier lieu et le château gonflable n'a pas fonctionné. Peut-être que quelqu'un de familier avec bouncycastle partagera leurs pensées. En attendant, je vais voir si cela fonctionne aussi sur Android.

public static void main(String[] args) { 
    try{ 
     // ----------------------------------------------------------------- 
     // Anonymous recommendation I found here: 
     // http://suhothayan.blogspot.com/2012/05/how-to-install-java-cryptography.html 
     // This fixed my problem. 
     try { 
      Field field = Class.forName("javax.crypto.JceSecurity"). 
           getDeclaredField("isRestricted"); 
      field.setAccessible(true); 
      field.set(null, java.lang.Boolean.FALSE); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     // -----------------------------------------------------------------   
     // Check recommended by Omikron, who was correct: I assume I didn't 
     // install the JCE properly because it prints 128 for the max 
     // key allowd key length. 
     int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES"); 
     System.out.printf("max key len: %d\n",maxKeyLen); 
     // ----------------------------------------------------------------- 

     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("JKS 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"); 
     bksKS.store(bksFos, testPass); 
     bksFos.close(); 

     // ------------------------- 
     // Open file and check key length: 
     bksKS = KeyStore.getInstance("PKCS12","BC"); 
     FileInputStream bksFis = new FileInputStream("G:\\testDest.bks"); 
     bksKS.load(bksFis, testPass); 
     PrivateKey bpk = (PrivateKey) bksKS.getKey(testAlias,testPass); 
     rsaKey = (RSAKey)bpk; 
     rsaKeyLen = rsaKey.getModulus().bitLength(); 
     System.out.printf("BKS key length is %d\n",rsaKeyLen); // 2048 
     X509Certificate bkCert = (X509Certificate) bksKS.getCertificate(testAlias); 
     System.out.printf("Issuer name: %s", bkCert.getIssuerDN().getName()); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
}