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

3

我刚使用了keytool命令:

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

我完成了所有后续提示的回答,这在本地目录中产生了一个名为mykeys.jks的密钥库。
我的问题是:这个JKS文件和其中包含的自签名证书的名称之间有什么关系?也就是说,我现在是否在这个密钥库中拥有名为"mykeys"的SSL证书?
附加问题:单个密钥库(JKS文件)是否可以拥有多个证书?如果可以,我该如何在同一JKS文件中添加第二个名为my2ndcert的SSL证书?
3个回答

5
首先,我们需要澄清一些术语。您创建的是私钥/公钥证书对。公钥证书包含您输入的所有信息,如电子邮件地址、姓名等,并绑定到私钥。
还可以将JKS文件格式视为可以存储多个私钥/公钥证书对以及单独存储公钥证书的zip文件。JKS文件有自己的密码来打开它们,每个私钥/公钥对都有自己的密码,但大多数人为简单起见将它们设置为相同的密码。
现在回答您的问题,在密钥库中,您创建的私钥将被称为selfsigned,因为这是您给它的别名。您可以使用相同的keytool命令和-importcert和-importkeystore标志添加更多私钥或仅公钥证书。
我强烈建议您使用此工具http://portecle.sourceforge.net/打开jks文件并查看其中内容。

4
这个JKS文件和其中包含的自签名证书的名称之间有什么关系?
JKS密钥库是证书、私钥或共享密钥的容器。它实际包含什么取决于使用了哪些命令。你可以有多个条目,每个条目都由其别名标识。
也就是说,我现在在这个密钥库中有一个名为“mykeys”的SSL证书吗?
不,这里的“mykeys.jks”只是文件名。你可以根据需要重命名此文件,它不会影响其内容。
此外,“证书名称”可能因上下文而异义。
通常(不特定于Java密钥库的上下文),证书名称将是其主题可分辨名称(Subject DN):这是其主题的标识符。这是通过回答问题(“您的名字和姓氏是什么?”等)填写的,或者你可以使用-dname预填充它。

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

您可以使用-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

Bonus question: can a single keystore (JKS file) have more than 1 cert inside of it? If so, how might I add a 2nd SSL cert named, say, my2ndcert to this same JKS file?

-genkey(在更近的版本中改名为-genkeypair)的作用是创建一个密钥对,并将公钥包装到自签名证书中。它会将其放置在selfsigned别名条目中(在您的示例中)。
如果mykeys.jks不存在,它将被创建。如果它已经存在,则会被修改(当然只有存储密码与现有文件的密码匹配时才会修改)。
如果您愿意,可以使用其他别名名称。您还可以使用-importcert(或-import)导入没有私钥的证书。 keytool -list将列出密钥库的内容,包括私钥条目或证书条目,所有这些条目都有各自的别名名称。
请注意,如果您要使用不是自签名的证书,则需要从生成的密钥对中生成证书请求,并将由您的CA颁发的证书重新导入到该别名中(实际上,如果需要链,则需要在该条目中导入完整链)。这将覆盖最初使用-genkeypair创建的自签名证书。

4

当您创建一个jks文件时,它里面有一个私钥条目,如果您没有为密钥指定别名,则默认为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是自签名证书。

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


当您创建jks文件时,它内部会有一个私钥条目...这取决于您如何创建它。-genkey会创建密钥对,-import则不会。 - Bruno
@Bruno 同意,但用户正在使用“-genkey”。 - dev2d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接