2013-08-30 4 views
2

Je fichier p12, je suis extrais la clé privée en utilisant OpenSSL, j'ai un mot de passe pour l'extraire.clé privée Extraction cryptage pkcs12 et le texte

openssl pkcs12 -in my.p12 -nocerts -out privateKey.pem 

Et après que je reçois ma clé privée, je suis en train d'utiliser cette clé pour le chiffrement:

public static void main(String[] args) throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     KeyPair keyPair = readKeyPair(privateKey, "testpassword".toCharArray()); 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
     byte[] textEncrypted = cipher.doFinal("hello world".getBytes()); 
     System.out.println("encrypted: "+new String(textEncrypted)); 
     cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
     byte[] textDecrypted = cipher.doFinal(textEncrypted); 
     System.out.println("decrypted: "+new String(textDecrypted)); 
    } 

    private static KeyPair readKeyPair(File privateKey, char[] keyPassword) throws IOException { 
     FileReader fileReader = new FileReader(privateKey); 
     PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword)); 
     try { 
      return (KeyPair) r.readObject(); // this returns null 
     } catch (IOException ex) { 
      throw new IOException("The private key could not be decrypted", ex); 
     } finally { 
      r.close(); 
      fileReader.close(); 
     } 
    } 

r.readObject(); renvoie la valeur null. Mais quand je crée une clé privée par moi-même par cette commande:

openssl genrsa -out privkey.pem 2048 

Le code ci-dessus fonctionne très bien.

  • Comment puis-je extraire correctement la clé privée du fichier p12?
  • Ou est-il possible d'utiliser le fichier p12 pour crypter/décrypter le texte sans extraire par la ligne de commande?

Je sais qu'il est juste PKCS#12 est juste fichier archaive qui stocke les clés.

Répondre

2

Je ne sais pas ce qui ne va pas avec votre code, mais je code qui lit des choses à partir d'un magasin de clés. J'ai lu le fichier dans une instance KeyStore et ensuite j'accède à la clé ou à l'entrée selon le cas. Voici quelques-uns des appels pertinents:

char[] password; 
String alias; 
java.security.KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); 
keyStore.load(inputStream, password); 
java.security.PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password); 
java.security.keystore.PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection(password)); 

Pour trouver l'alias de l'entrée qui vous intéresse, je vous suggère d'utiliser keytool (livré avec JDK):

keytool -list -v -keystore keystore.pkcs12 -storetype pkcs12 

Vous serez invité à la keystore mot de passe, puis obtenir des informations comme suit:

Keystore type: PKCS12 
Keystore provider: SunJSSE 

Your keystore contains 1 entry 

Alias name: thealias 
Creation date: Aug 30, 2013 
Entry type: PrivateKeyEntry 
Certificate chain length: 2 
[... lots of info about the certificates deleted ...] 
+0

Salut Rob merci pour votre réponse. J'ai essayé de telle manière avant. mon keystore n'a aucun alias en quelque sorte. est-il possible de trouver un moyen. J'ai un certificat avec le fichier p12. – user2662294

+0

Ajout de certains détails sur la liste du contenu du fichier de clés, peut-être vous pouvez trouver l'alias qui est sur l'entrée qui vous intéresse. – Rob

+0

Il me montre ceci: Keystore type: PKCS12 Fournisseur de magasin de clés: SunJSSE Votre keystore contient 0 entrées', BTW, j'ai * .cer, fichier avec mon fichier .p12. Y a-t-il quelque chose à voir avec ça? Merci! – user2662294

Questions connexes