2015-01-21 2 views
0

Привет, Я разрабатываю чат-программу, которая будет использовать keystores в java. В настоящий момент вы можете загрузить хранилище ключей через аргумент командной строки в терминале. Программа будет начата следующей java Chat /keystore TEST.keystore - основной методМожно ли загружать в KeyStore с помощью JFileChooser?

public static void main(String[] args) { 
    int arg_length = args.length; 
    switch (arg_length) { 
    case 1: 
     if (args[0].equalsIgnoreCase("/keystore")) { 
      keystore = args[1]; 
      File test = new File(keystore); 
      if (!test.exists()) { 
       displayHelpInformation(); 
      } 
     } else { 
      displayHelpInformation(); 
     } 
     break; 
    } 
    Chat my_server = new Chat(port); 
} 

Keystore объявлен в виде строки и, как вы можете увидеть ниже загружает хранилище ключей из данного входного потока.

private SSLServerSocketFactory getSSLServerSocketFactory() {  
    SSLContext ctx = null; 
    try { 
     KeyManagerFactory kmf; 
     TrustManagerFactory tmf; 
     KeyStore ks; 
     char[] password = "password".toCharArray(); 
     // Returns a SSLContext object that implements the specified secure 
     // socket protocol. 
     ctx = SSLContext.getInstance("TLS"); 
     kmf = KeyManagerFactory.getInstance(KeyManagerFactory 
       .getDefaultAlgorithm()); 
     tmf = TrustManagerFactory.getInstance(TrustManagerFactory 
       .getDefaultAlgorithm()); 
     // returns keystore object of type Java KeyStore 
     ks = KeyStore.getInstance("JKS"); 
     ks.load(new FileInputStream(keystore), password); 
     kmf.init(ks, password); 
     tmf.init(ks); 
     ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return ctx.getServerSocketFactory(); 
} 

То, что я пытаюсь сделать, это позволить пользователю выбрать хранилище ключей с помощью JFileChooser в главном окне вместо того чтобы использовать аргументы командной строки? Это возможно? Меня беспокоит тот факт, что хранилище ключей имеет пароль.

ответ

0

Вы можете делать все, что хотите, с помощью JFileChooser ... Я использовал его много в последнее время, это не идеально, но это полезно.

Мой пример будет идти, как это:

public boolean openFile() { 
     JFileChooser jfc = new JFileChooser(); 
// OPTIONAL : if you would like to make the choices only *.keystore 
     FileFilter ff = new ExtensionFileFilter("KeyStore Files", new String[] { "keystore" }); 
     jfc.setFileFilter(ff); 
// END OF OPTIONAL 
     jfc.setCurrentDirectory(new File(".")); // base folder 
     jfc.setDialogTitle("Choose a KeyStore"); 
     int jfcReturnValue = jfc.showOpenDialog(parentFrame); 
     if (jfcReturnValue == JFileChooser.APPROVE_OPTION) { 
      // sourceFile here would be the *.keystore file selected 
      File sourceFile = jfc.getSelectedFile(); 
     } else { 
      System.out.println("Openning a file cancelled."); 
      return false; 
     } 
     return true; 
    } 

Вы можете изменить тип возврата в файл, если вы хотите, чтобы способ вернуть файл, но я обычно просто отправить истинным или ложным, как уведомление успеха или неудачи ,

Что касается части пароля. Если вы успешно используете ks.load(new FileInputStream(keystore), password);, то вам будет передан файл, который вы получили от JFileChooser.


ДОПОЛНИТЕЛЬНОЕ КЛАСС:

class ExtensionFileFilter extends FileFilter { 
    String description; 

    String extensions[]; 

    public ExtensionFileFilter(String description, String extension) { 
     this(description, new String[] { extension }); 
    } 

    public ExtensionFileFilter(String description, String extensions[]) { 
     if (description == null) { 
      this.description = extensions[0]; 
     } else { 
      this.description = description; 
     } 
     this.extensions = (String[]) extensions.clone(); 
     toLower(this.extensions); 
    } 

    private void toLower(String array[]) { 
     for (int i = 0, n = array.length; i < n; i++) { 
      array[i] = array[i].toLowerCase(); 
     } 
    } 

    public String getDescription() { 
     return description; 
    } 

    public boolean accept(File file) { 
     if (file.isDirectory()) { 
      return true; 
     } else { 
      String path = file.getAbsolutePath().toLowerCase(); 
      for (int i = 0, n = extensions.length; i < n; i++) { 
       String extension = extensions[i]; 
       if ((path.endsWith(extension) && (path.charAt(path.length() - extension.length() - 1)) == '.')) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 
+0

Не могли бы вы разъяснял, как я хотел бы сделать это ** Что касается пароля части. Если вы используете ks.load (новый FileInputStream (keystore), пароль); с успехом, а затем передать ему файл, который вы получили от JFileChooser, также будет работать. ** – roukzz

+0

Ну, JFileChooser предоставит объект File. Это можно использовать любым способом. Поэтому просто передайте этот File Object стандартным способом загрузки хранилища ключей, и он должен работать так же, как если бы он был передан в качестве аргумента. 'file.getAbsolutePath();' даст вам строку пути к файлу, о котором идет речь ... Если вы хотите поговорить об этом больше, присоединитесь к http://collabedit.com/y96km – Ubica

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