2009-11-29 5 views
0

Это задавали несколько раз, но ни один из них не обеспечивал кодированные тестовые примеры. Здесь я приведу пример проблемы:Java: Неверный формат хранилища ключей, сгенерированный с помощью кода

  1. программного генерацию ключей (работы)
  2. создания сертификата в том магазине (работы)
  3. экономии хранилища ключей на диск (работы)
  4. листинга хранилища ключей с Keytool (работ)
  5. Загрузка хранилища ключей программно (не удается с IOException: InvalidKeystoreFormat)

Что я не г et is that as save и load, я использую KeyStore.getInstance («JKS»), но его сбои. Любые предложения приветствуются! Выход

Runtime:

 
Creating private keystore at 'private.keystore'. 
Created keystore, now created signer cert 
Created signer cert, saving cert 
Reloading keystore: 
Failed to load the keystore after creation: Invalid keystore format 

Test Источник случая:

 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.InvalidKeyException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.security.PrivateKey; 
import java.security.SignatureException; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import sun.security.x509.X500Name; 

public class KeystoreCreator 
{ 
private String fPrivateKeyStore; 
private String fPrivateKeyStorePassword; 
private String fPrivateKeyStoreKeyPassword; 
private String fPublicKeyCipherPassword; 
private String fPrivateKeyAlias; 

/** 
    * @param args 
    * @throws Exception 
    */ 
public static void main(String[] args) throws Exception 
{ 
    KeystoreCreator creator = new KeystoreCreator(); 

    creator.setPrivateKeyStore("private.keystore"); 
    creator.setPrivateKeyStorePassword("beer123"); 

    creator.setPrivateKeyAlias("myalias"); 
    creator.setPrivateKeyStoreKeyPassword("beer123"); 
    creator.setPublicKeyCipherPassword("beer123"); 

    creator.initKeyStores(); 
} 

public KeystoreCreator() 
{ 
} 

public void setPrivateKeyStore(String name) 
{ 
    fPrivateKeyStore=name; 
} 
public void setPrivateKeyStorePassword(String pass) 
{ 
    fPrivateKeyStorePassword=pass; 
} 
public void setPrivateKeyStoreKeyPassword(String pass) 
{ 
    fPrivateKeyStoreKeyPassword=pass; 
} 
public void setPublicKeyCipherPassword(String pass) 
{ 
    fPublicKeyCipherPassword=pass; 
} 
public void setPrivateKeyAlias(String alias) 
{ 
    fPrivateKeyAlias=alias; 
} 

    public void initKeyStores() throws Exception 
    { 
     OutputStream out = null; 
     File f=new File(fPrivateKeyStore); 
     if (f.exists()) 
     { 
     f.delete(); 
     if (f.exists()) 
     { 
      throw new IOException("Want to remove the keystore but can't, still reported as present after removal"); 
     } 
     } 
     try 
     { 
     System.out.println("Creating private keystore at '" + fPrivateKeyStore + "'."); 
     out = new FileOutputStream(fPrivateKeyStore); 
     KeyStore privateKeyStore = KeyStore.getInstance("JKS"); 
     privateKeyStore.load(null, fPrivateKeyStorePassword.toCharArray()); 

     System.out.println("Created keystore, now created signer cert"); 
     X500Name x500name=getCA(); 
     Certificate cert = createCertificate(fPrivateKeyAlias, fPrivateKeyStoreKeyPassword, x500name, privateKeyStore); 

     System.out.println("Created signer cert, saving cert"); 
     privateKeyStore.store(out, fPublicKeyCipherPassword.toCharArray()); 
     out.flush(); 
     out.close(); 
     //try to load it. 
     KeyStore reloadedKeyStore = KeyStore.getInstance("JKS"); 
     try 
     { 
      InputStream reloadedIs=getClass().getClassLoader().getResourceAsStream(fPrivateKeyStore); 
      if (reloadedIs!=null) 
      { 
      System.out.println("Reloading keystore:"); 
      reloadedKeyStore.load(reloadedIs, fPrivateKeyStorePassword.toCharArray()); 
      } 
     } 
     catch (Exception e) 
     { 
      System.err.println("Failed to load the keystore after creation: "+e.getLocalizedMessage()); 
     } 
     } 
     catch (Exception e) 
     { 
     System.err.println("Failed to save the keystore: "+e.getLocalizedMessage()); 
     } 
    } 

    private X500Name getCA() throws IOException 
    { 
    return new sun.security.x509.X500Name("a","b", "c","d","e", "GB"); 
    } 

    public Certificate createCertificate(String alias, String keyPassword, 
      sun.security.x509.X500Name x500Name, KeyStore keyStore) throws NoSuchAlgorithmException, 
      InvalidKeyException, CertificateException, SignatureException, NoSuchProviderException, 
      KeyStoreException {  
     sun.security.x509.CertAndKeyGen keypair = new sun.security.x509.CertAndKeyGen("RSA", "MD5WithRSA"); 
     keypair.generate(1024); 
     PrivateKey privKey = keypair.getPrivateKey(); 
     X509Certificate[] chain = new X509Certificate[1]; 
     chain[0] = keypair.getSelfCertificate(x500Name, 7000 * 24 * 60 * 60); 
     keyStore.setKeyEntry(alias, privKey, keyPassword.toCharArray(), chain); 

     Certificate cert = keyStore.getCertificate(alias); 
     return cert; 
    } 
} 

ответ

2

1) Вы создать частное хранилище ключей в текущем рабочем каталоге, путем записи на файл: new FileOutputStream(fPrivateKeyStore);

2) Позже вы считаны из класса пути с помощью getClass().getClassLoader().getResourceAsStream(fPrivateKeyStore);

Я думаю, что вы читаете неправильные файлы. И уже есть еще один с именем private.keystore из предыдущих тестов. Чтобы проверить, вы можете распечатать абсолютный путь к файлу обоих файлов, например. new File(fPrivateKeyStore).getAbsolutePath() и сравнить его с getClass().getClassLoader().getResource(fPrivateKeyStore).toFileURL();

+0

OMG, как я пропустил это. Спасибо, все хорошо сейчас. – javahollic

0

Я может быть что-то не хватает, но почему бы не просто повторно загрузить личное хранилище ключей с помощью FileInputStream?

InputStream reloadedIs = new FileInputStream(fPrivateKeyStore); 

(я не уверен, что это устранит проблему, я только что заметил это во время сканирования коды)

Смежные вопросы