私钥和公钥分开

时间:2015-11-02 19:32:54

标签: openssl java

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

1)我是否必须从每个客户端的提示中创建证书和密钥?或者是另一个"自动化"例如用脚本?

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

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

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

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

private void setupServerKeystore() throws GeneralSecurityException, IOException {
    serverKeyStore = KeyStore.getInstance( "JKS" );
    serverKeyStore.load( new FileInputStream("serverpublickwy.jks"), 
                        "university".toCharArray() );
  } 
   private void setupClientKeyStore() throws GeneralSecurityException, IOException {
    clientKeyStore = KeyStore.getInstance( "JKS" );
    clientKeyStore.load( new FileInputStream( "client1privatekey.jks" ),
                       "university".toCharArray() );} 

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

1 个答案:

答案 0 :(得分:1)

你在这里设置的东西看起来相当原始和脆弱。 JKS商店实际上是一个真正的痛苦,但它们都是一些Java库所能接受的,所以如果你遇到困难,你就会陷入困境。

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

是关于keytool基础知识的一个相当不错的教程,keytool是操纵密钥库的标准方法。 JKS文件可以具有密钥对& CSR,或密钥对&签署证书或任何数量的证书w。没有与他们有关系的密钥对。

脚本

通常我将这些脚本编写为命令行驱动的案例,这些案例是我需要执行的任何启动脚本的一部分。我的基本前提是,如果密钥对没有离开它创建的框,那么它是最安全的。因此,当我设置盒子时,我会关注密钥对创建,密码设置和CSR生成。使用开放式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文件。 PKCS12s是Java之外的默认设置,因此看到它们加入标准版本是相当不错的。

信任商店

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

  

问题是如何单独创建这些jks文件? publickey.jks文件是cert,对吗?如何从私钥中将其存储在另一个文件中并从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