Java证书和密钥库之间的关系

时间:2014-04-30 16:01:59

标签: java ssl ssl-certificate keytool

我刚刚使用了keytool

keytool -genkey -keyalg RSA -alias selfsigned -keystore mykeys.jks -storepass password -validity 360 -keysize 2048

...然后回答了它提示我的所有后续问题。这会在我的本地目录中生成mykeys.jks密钥库。

我的问题:此JKS文件与其中包含的自签名证书的名称之间的关系是什么?含义,我现在是否有SSL cert在这个密钥库中命名为“mykeys”?

奖金问题:单个密钥库(JKS文件)中是否可以包含多个证书?如果是这样,我如何向这个相同的JKS文件添加名为my2ndcert的第二个SSL证书?

3 个答案:

答案 0 :(得分:5)

首先我们应该清理一些术语。您创建的是私钥/公钥证书对。公钥证书包含您输入的所有信息,如您的电子邮件地址,姓名等,并绑定到私钥。

还可以将JKS文件格式视为可以存储多个私钥/公钥证书对的zip文件,也可以自行存储公钥证书。 JKS文件有自己的密码来打开它们,每个私钥/公钥对都有自己的密码,但大多数人为了简单起见将它们设置为相同的密码。

现在回答您的问题,在密钥库中,您创建的私钥将被称为自签名,因为它是您提供的别名。您可以使用带有-importcert和-importkeystore标志的相同keytool命令添加更多私钥或仅添加公钥证书。 http://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html

我强烈建议您使用此工具http://portecle.sourceforge.net/打开jks文件,看看里面有什么。

答案 1 :(得分:4)

当你创建一个jks文件时,里面有一个私钥条目,如果没有为key指定任何别名,默认情况下它是myKey

您可以尝试列出jks文件以查看相同的密钥

运行

keytool -list -keystore mykeys.jks -storepass <password to mykeys.jks>

使用以下命令

可以将自签名证书导出此密钥库
keytool -export -alias <keyalias> -file abc.cer -keystore mykeys.jks -storepass <password to mykeys.jks>

文件abc.cer是自签名证书

奖励答案:是的,您的一个密钥库可以包含多个具有不同别名的密钥 ,如果您导入它们也可以包含多个证书

答案 2 :(得分:4)

  

此JKS文件与其名称之间的关系是什么?   里面包含自签名证书?

JKS密钥库是证书,私钥或共享密钥的容器。它究竟包含的内容取决于使用了哪些命令。您可以有多个条目。每个条目都由其别名标识。

  

意思是,我现在在这个密钥库中有一个名为“mykeys”的SSL证书吗?

不,在这里,mykeys.jks只是文件名。您可以根据需要重命名此文件,但不会影响其内容。

此外,“证书名称”可以有多种含义,具体取决于上下文。

通常(不是特别在Java密钥库的上下文中)证书名称将是其主题专有名称(主题DN):这是标识其主题的内容。通过回答问题(“你的名字和名字是什么?”等等)来填补这一点,或者你可以使用-dname预先填写这个问题。

该主题DN中的CN(也是“您的姓名是什么?”的答案)经常被各种证书管理工具用作证书的简称(如果有列表或表)。对于服务器证书,还建议使用CN作为服务器的主要主机名(如果您没有使用主题备用名称扩展名,它甚至是强制性的。)

您可以使用-ext选项添加其他SAN(例如-ext SAN=dns:your.host.name)。建议使用SAN(在所有时间),但很多人在使用keytool生成证书时不会这样做(可能是因为教程很少提及它,因为它仅与Java 7捆绑的版本一起引入) )。

keytool -genkey -keyalg RSA -alias selfsigned 
     -keystore mykeys.jks -storepass password -validity 360 -keysize 2048
     

奖金问题:单个密钥库(JKS文件)中是否可以包含多个证书?如果是这样,我如何将这个名为my2ndcert的第二个SSL证书添加到同一个JKS文件中?

-genkey(在更新版本中重命名为-genkeypair)的作用是创建密钥对,并将公钥包装到自签名证书中。它会将其放在selfsigned别名条目中(在您的示例中)。

如果mykeys.jks不存在,则会创建它。如果它已经存在,它将被修改(仅当商店密码与现有文件的密码匹配时)。

如果您愿意,可以使用其他别名。您还可以使用-importcert(或-import)导入证书(不使用私钥)。

keytool -list将列出密钥库的内容,包括私钥条目或证书条目,所有这些都具有各自的别名。

请注意,如果您要使用非自签名证书,则需要从您生成的密钥对生成证书请求,然后重新导入由您签发的证书CA进入该别名(事实上,如果需要链,则该条目中为you'll need to import the full chain)。这将覆盖最初使用-genkeypair创建的自签名证书。