即使密钥库存在,Java Keytool CSR也会出错

时间:2017-08-02 11:16:58

标签: java ssl certificate keystore truststore

我想在我自己的服务器之间安全地交换数据,这些不会离开内部域。为此,我想:

  1. 为密钥库生成密钥。

  2. 使用Keytool生成CSR,指定上面的密钥。

  3. 将响应导入我的默认cacerts文件,以便我可以将其称为我的信任库。

  4. 所以:

    1. 首先,我使用以下(默认加密算法)生成密钥对:
    2. keytool -genkeypair -alias mykeys -keystore mykeystore.jks -keypass changeit -storepass changeit -keysize 1024 -noprompt

      1. 然后,我使用以下命令创建CSR:
      2. keytool -certreq -alias myinternalcert -keystore mykeystore.jks -storepass changeit -file myinternalcert.csr

        它会抛出以下错误:

        keytool error: java.lang.Exception: Alias <myinternalcert> does not exist

        我试图在甲骨文的博客中寻找示例,看起来这是正确生成CSR的方法 - 但就我的情况而言,这都是错误:)

        到目前为止,我对SSL的唯一理解是:

        1. 密钥库 - 我想将自己验证到另一台服务器/客户端,我的私钥在我的密钥库中。我也会用它来签署我的证书。

        2. 信任存储 - 这是为了确定我收到的信息是来自合法来源的信息,即我是否信任它们。我在这里存储证书。

2 个答案:

答案 0 :(得分:0)

  1. 创建CSR并导入生成密钥对时使用的签名证书时,需要使用相同的别名。
  2. 您应该将签名证书响应导入密钥库。不是您的信任库。您不信任已签名的证书,您拥有,因此它属于您的密钥库。您的信任库适用于您信任的其他证书。

答案 1 :(得分:-1)

好的 - 我自己的错。

实际上alias与为keystore创建的别名相同。 thanks to this post on Digital Ocean

keytool -certreq -help并未真正打印出明确的信息:

选项:

 -alias <alias>                  alias name of the entry to process (should have been "Alias of the keystore entry being used")
 -sigalg <sigalg>                signature algorithm name
 -file <filename>                output file name
 -keypass <arg>                  key password
 -keystore <keystore>            keystore name
 -dname <dname>                  distinguished name
 -storepass <arg>                keystore password
 -storetype <storetype>          keystore type
 -providername <providername>    provider name
 -providerclass <providerclass>  provider class name
 -providerarg <arg>              provider argument
 -providerpath <pathlist>        provider classpath
 -v                              verbose output
 -protected                      password through protected mechanism