【问题标题】:What is the correct setup using keystores for SSL handshakes in Java在 Java 中使用密钥库进行 SSL 握手的正确设置是什么
【发布时间】:2015-01-15 17:22:18
【问题描述】:

我正在使用 JSSE 在 Java 中开发一个安全的聊天程序。

为了让 2 人交流,您指定要使用的密钥库,例如Bob 将使用 bob.keystore 启动程序,alice 将使用 alice.keystore 启动程序

我的设置和工作方式如下

在 Bob 方面,他有一个密钥库,其中包含他的密钥对,并且将 Alice 的证书作为可信证书导入。

在 Alices 这边,她有一个密钥库,其中包含她的密钥对和 Bob 的证书作为可信证书导入。

这是正确的设置/程序吗?

【问题讨论】:

    标签: java ssl keystore jsse


    【解决方案1】:

    在 Bob 方面,他有一个密钥库,其中包含他的密钥对,并且将 Alice 的证书作为可信证书导入。

    鲍勃应该有:

    • 一个 keystore 包含他的密钥对和证书,以及
    • 一个 truststore 包含 Alice 导出的证书。

    在 Alices 这边,她有一个密钥库,其中包含她的密钥对和 Bob 的证书作为可信证书导入。

    爱丽丝应该有:

    • 一个 keystore 包含她的密钥对和证书,以及
    • 一个 truststore 包含 Bob 导出的证书。

    这是正确的设置/程序吗?

    没有。密钥库是一种珍贵的、私密的东西,其中包含对隐私至关重要的数据。信任库只包含其他人的证书,因此没有什么可贵的。您不应将相同的物理文件用于这两种目的。这就是为什么它们在 JSSE 中是分开的。

    【讨论】:

    • 我只能加载到一个文件中,我将它作为命令行参数解析,纯粹是为了展示当前正在工作的 JSSE 调试输出。如果 Alice 想与 Bob 通信怎么办,Alice 在一侧将她的密钥库加载到程序中,而 Bob 在另一侧加载他的信任库(其中包含 Bob 的证书)。然后 Alice 尝试与 bob 交流,这是否可行?
    • 为什么只能加载一个文件?
    • 在 main 方法中加载密钥库文件的代码是 int arg_length = args.length; switch (arg_length) { case 2: if (args[0].equalsIgnoreCase("/keystore")) { keystore = args[1]; File test = new File(keystore); if (!test.exists()) { displayHelpInformation(); } } else { displayHelpInformation(); } break;
    • keystore对应private SSLServerSocketFactory getSSLServerSocketFactory() method中的一个字符串----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(); }
    • 您可以将 KeyStore 加载到密钥管理器中,并将信任库加载到信任管理器中。一个文件的限制只是你自己的代码的限制,而不是JSSE的限制。
    猜你喜欢
    • 2016-02-13
    • 2012-05-17
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-09-19
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多