2016-06-10 4 views
0

génération de la clé privéeProblème pour générer la clé privée

  public PrivateKey getStoredPrivateKey(String filePath) { 
    PrivateKey privateKey = null; 
    byte[] keydata = getKeyData(filePath); 
    PKCS8EncodedKeySpec encodedPrivateKey = new PKCS8EncodedKeySpec(keydata); 
    KeyFactory keyFactory = null; 
    try { 
     keyFactory = KeyFactory.getInstance("RSA"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    try { 
     System.out.println("hello"); 
     privateKey = keyFactory.generatePrivate(encodedPrivateKey); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 
    return privateKey; 
} 

Je l'utilise ici

PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath); 

mais son erreur montrant

hello 
    java.security.spec.InvalidKeySpecException:       
    java.security.InvalidKeyException: IOException : version mismatch: (supported:  00, parsed:  03 
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) 

Je passe un (.p12) dans la fonction getStoredPrivateKey (String filePath).

pourquoi son erreur donnant?

+0

Etes-vous sûr que votre clé privée est de spécification PKCS # 8. Essayez avec d'autres spécifications comme RSAPrivateKeySpec –

+0

comment puis-je identifier que ce n'est pas PKCS # 8 – Mudit

Répondre

1

P12 est le type de magasin de clés où plusieurs clés et certificats peuvent être stockés et un mot de passe peut être utilisé pour les protéger. Vous pouvez rechercher sur P12 (PKCS12) sur Internet. Votre fichier est un fichier P12, il est donc très probable qu'il s'agit d'un fichier au format PKCS12.

Pour obtenir la clé privée du fichier P12, utilisez le code ci-dessous. Vous avez besoin de choses ci-dessous avant d'appeler ce code.

filePath. Chemin d'accès (absolu) du fichier P12.

filePassword. C'est un char []. Représente le mot de passe du fichier p12.

keyPassword. C'est un char []. Représente le mot de passe pour la clé privée. La plupart des sont probablement les mêmes que filePassword.

alias. Un string. Représente par quel alias une clé privée stockée dans P12 archive/keystore.

Pour vérifier quel est l'alias de votre clé privée, vous pouvez utiliser la commande ci-dessous

keytool -list -v -keystore <yourfile>.p12 -storetype pkcs12 

Il vous demandera le mot de passe puis imprimer plusieurs lignes. Recherchez

Entry Type: PrivatKeyEntry 

Vous y trouverez l'alias.

Initialisez ces variables, puis utilisez le code ci-dessous pour obtenir la clé privée. Vous pouvez également obtenir des certificats/clé publique associée à cette clé. Recherchez l'API de PrivateKeyEntry

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(new FileInputStream(filePath), filePassword); 
PrivateKeyEntry keyEntry = (PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(keyPassword)); 
PrivateKey key = privateKeyEntry.getPrivateKey();