Java 是否可以使用JFileChooser加载密钥库?

Java 是否可以使用JFileChooser加载密钥库?,java,ssl,keystore,jfilechooser,jsse,Java,Ssl,Keystore,Jfilechooser,Jsse,您好,我正在开发一个聊天程序,它将使用java中的密钥库。此时,您可以通过终端中的命令行参数加载密钥库。该程序将按如下方式启动:java Chat/keystore TEST.keystore-main方法 public static void main(String[] args) { int arg_length = args.length; switch (arg_length) { case 1: if (args[0].equalsIgnoreC

您好,我正在开发一个聊天程序,它将使用java中的密钥库。此时,您可以通过终端中的命令行参数加载密钥库。该程序将按如下方式启动:java Chat/keystore TEST.keystore-main方法

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被声明为字符串,正如您在下面看到的,我从给定的输入流加载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选择密钥库,而不是使用命令行参数?这可能吗?我担心密钥库有密码这一事实。

您可以使用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;
    }
如果希望方法返回文件,可以将返回类型更改为File,但我通常只发送true或false作为成功或失败的通知

至于密码部分。如果您使用
ks.load(新文件输入流(密钥库)、密码)如果成功,那么将从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;
    }
}
class ExtensionFileFilter扩展FileFilter{
字符串描述;
字符串扩展名[];
公共ExtensionFileFilter(字符串描述、字符串扩展){
这(描述,新字符串[]{extension});
}
公共扩展名过滤器(字符串描述,字符串扩展名[]){
if(description==null){
this.description=扩展[0];
}否则{
this.description=描述;
}
this.extensions=(字符串[])extensions.clone();
toLower(此为扩展);
}
private void toLower(字符串数组[]){
for(int i=0,n=array.length;i
您是否介意详细说明我将如何处理密码部分。如果使用ks.load(新文件输入流(密钥库)、密码);如果成功,那么将从JFileChooser获得的文件传递给它也会起作用。这可以用任何你喜欢的方式。因此,只需将该文件对象传递给加载密钥库的标准方式,它的工作方式应该与作为参数传递的方式相同
file.getAbsoleTPath()将为您提供有关文件的路径字符串。。。如果你想更多地谈论它,加入吧