Java 是否可以使用JFileChooser加载密钥库?
您好,我正在开发一个聊天程序,它将使用java中的密钥库。此时,您可以通过终端中的命令行参数加载密钥库。该程序将按如下方式启动:java Chat/keystore TEST.keystore-main方法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
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()代码>将为您提供有关文件的路径字符串。。。如果你想更多地谈论它,加入吧