【问题标题】:private and public keys separately私钥和公钥分别
【发布时间】:2016-02-03 22:45:30
【问题描述】:

我想在 java 中通过 SSL/TLS 建立客户端服务器通信。服务器是多线程的。使用 openssl,我充当了我自己的 CA(为权威创建了私钥和自签名证书)。现在我想为我的服务器和客户端创建从我创建的 CA 签名的密钥和证书。

1) 我是否必须根据提示为每个客户端创建证书和密钥?或者它是另一种“自动化”方式,例如有脚本吗?

2) 我已经看到了用于设置密钥库的这段代码

 private void setupClientKeyStore() throws GeneralSecurityException, IOException
    {
    clientKeyStore = KeyStore.getInstance("JKS");
    clientKeyStore.load(new FileInputStream("client1publickey.jks"),
                       "密码".toCharArray() );
    }

    private void setupServerKeystore() 抛出 GeneralSecurityException、IOException
    {
    InputStream keyStoreResource = new FileInputStream("serverprivatekey.jks");
    char[] keyStorePassphrase = "密码".toCharArray();
    serverKeyStore = KeyStore.getInstance("JKS");
    serverKeyStore.load(keyStoreResource, keyStorePassphrase);
}

我已运行命令查看这些条目的类型,client1publickey 是 TrustedCert 条目,而 serverprivatekey 是 PrivateKey 条目。此代码在我的服务器类上。我的客户端类中有此​​代码

private void setupServerKeystore() 抛出 GeneralSecurityException, IOException {
    serverKeyStore = KeyStore.getInstance("JKS");
    serverKeyStore.load(new FileInputStream("serverpublickwy.jks"),
                        "大学".toCharArray());
  }
   私人无效 setupClientKeyStore() 抛出 GeneralSecurityException,IOException {
    clientKeyStore = KeyStore.getInstance("JKS");
    clientKeyStore.load(new FileInputStream("client1privatekey.jks"),
                       "大学".toCharArray() );} 

问题是如何分别创建这些 jks 文件? publickey.jks 文件是证书,对吗?如何从私钥将其保存在另一个文件中并从 CA 签名?还是我可以在客户端/服务器之间建立连接的另一种方式?首先,我使用 openssl 创建了 CA,然后服务器和客户端的两个 jks 文件包括证书和密钥。

【问题讨论】:

  • 我对你在问什么感到困惑。您是否正在寻找一种自动化方法来为您的每个客户生成唯一的密钥库以实现相互身份验证并让您的服务认可它们?
  • 正是我要找的!

标签: openssl java


【解决方案1】:

您在此处设置的内容看起来相当原始且脆弱。 JKS 存储实际上很难使用,但它们是一些 Java 库会接受的全部,所以如果你被卡住了,你就会被卡住。

http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html

是关于 keytool 基础的相当不错的教程,keytool 是操作密钥存储的标准方法。 JKS 文件可以具有密钥对和 CSR,或密钥对和签名证书或任意数量的证书 w。没有与之关联的密钥对。

脚本

通常我将这些脚本编写为命令行驱动的案例,这些案例是我需要执行的任何启动脚本的一部分。我的基本前提是,如果密钥对不离开创建它的盒子,那么它是最安全的。所以密钥对创建、密码设置和 CSR 生成是我在设置盒子时要处理的事情。使用 open SSL 或 keytool 不仅可以编写密钥对和 CSR 设置脚本,还可以将 CSR 发送到 CA。如果您想一路走下去,您甚至可以编写脚本查询 CA 以获取签名证书。

我倾向于在 Java 或 JEE 框架之外执行此操作。我使用适合我选择的操作系统的任何脚本机制。

话虽如此,我相信这段代码:

http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html

提供了如何在 Java 中设置 JKS 的示例。

特别有趣的是,至少在 Java 7 中,您可以使用 PKCS 12 代替 JKS 文件。 PKCS12 是 Java 之外的默认值,因此很高兴看到它们加入标准。

信任商店

JKS 文件或 PKCS12 也可以包含所有受信任证书的捆绑包。在大多数情况下,这是层次结构中的 CA 或 CA 集。这个信任库可以大规模分布,为简单起见,您可以将它放在您计划以这种方式配置的每台服务器的构建中。您可能还希望将软件包托管在可以轻松从任何服务器获取干净副本的地方。

问题是如何分别创建这些 jks 文件? publickey.jks 文件是证书,对吗?如何从私钥将其保存在另一个文件中并从 CA 签名?还是我可以在客户端/服务器之间建立连接的另一种方式?

好吧,我想你在这里失去了我。

Java Key Stores 的基本前提是描述和签署您的密钥对的公钥的证书与密钥对位于同一位置。无论实体(服务器或客户端)都需要 1 个 JKS 文件,该文件包含与其身份相关的所有信息,包括密钥对和证书。

在这种特殊情况下尝试将它们分开以进行长期存储对我来说没有多大意义。

但是,如果您要问的是“我如何将我需要在 CA 签名的内容与我的私钥分开,这样我就不必随身携带我的私钥了?” - 这是一个很好的问题。答案是 CSR(证书签名请求),它是一个自签名的信息块,仅包括公钥和一堆您希望 CA 在签署证书时使用的信息。在关键工具中做到这一点的方法是:

keytool -certreq -alias mydomain -keystore keystore.jks -storepass password -file mydomain.csr

最后你会在“mydomain.csr”中拥有它

您将使用它从 CA 获取签名证书,然后将其上传:

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks -storepass password

【讨论】:

  • 非常感谢
猜你喜欢
  • 2013-07-09
  • 2011-07-19
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2017-09-20
  • 2017-01-27
相关资源
最近更新 更多