这个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
创建的自签名证书。
-genkey
会创建密钥对,-import
则不会。 - Bruno