Java 密钥库文件中“别名”属性的用途/作用是什么?

信息安全 证书 爪哇
2021-08-23 11:29:09

alias我听说过有关Java 密钥库文件中属性用途的相互矛盾的信息。有人可以澄清一下这个属性到底是什么,以及在为常规 Web 服务器链中的叶证书和中间证书创建新的 java 密钥库时应该设置什么?

我曾经认为这alias只是 jks 文件中每个条目的唯一标识符,因此叶子将具有中间证书不同的别名。现在,我不太确定。有人可以澄清吗?

4个回答

别名

要回答您的直接问题,别名字段应该是一个唯一的字符串,用于标识密钥条目。这适用于所有类型,例如受信任的和中间的。

文档

钥匙工具

密钥库别名

所有密钥库条目(密钥和可信证书条目)都通过唯一别名访问。

当您使用 -genseckey 命令生成密钥、使用 -genkeypair 命令生成密钥对(公钥和私钥)或使用 -importcert 命令将证书或证书链添加到受信任的证书列表。后续的 keytool 命令必须使用相同的别名来引用实体。

例如,假设您使用别名 duke 生成新的公钥/私钥对,并通过以下命令将公钥包装到自签名证书中(请参阅证书链):

keytool -genkeypair -alias duke -keypass dukekeypasswd

这指定了后续命令访问与别名 duke 关联的私钥所需的初始密码“dukekeypasswd”。如果您以后想更改 duke 的私钥密码,请使用如下命令:

`keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass` 

这会将密码从“dukekeypasswd”更改为“newpass”。

请注意:密码实际上不应在命令行或脚本中指定,除非用于测试目的,或者您在安全系统上。如果您未在命令行上指定所需的密码选项,系统将提示您输入

标准和实践

我不认为有任何固定的命名标准,我相信你可以与 10 个不同的人交谈并得到 10 个不同的答案。您只希望它独特且合乎逻辑。

API 和 Oracle 的 Keytool 在检查重复项方面做得不是很好,考虑到它用于识别密钥存储中的每个条目,我认为这是一个特别的疏忽。

解决重复的最佳方法是生成一个新的密钥库,并将旧密钥库中的每个条目添加到具有唯一别名的新密钥库中。您可以遍历密钥库并使用其时间戳来识别存储中的不同证书。

我有完全相同的问题,你完美地表达了这个问题。我在实验后的理解(遗憾的是文档没有明确说明这一点)是:

  1. 别名不是单一对象标识符;您可以对密钥库中的密钥和证书条目使用相同的别名,而不会抹去另一个。

  2. 实际上,您必须对密钥及其关联的证书使用相同的别名,才能将它们联系在一起。链中的其他证书应具有不同的别名,并使用您选择的合理名称来识别它们。

我不是这方面的专家,所以请用正确的盐粒回答我的问题。

你的问题不是很清楚,但回答一种可能性:

抽象KeyStoreAPI和具体的 JKS 格式有两种与 SSL/TLS 相关的条目:privateKey服务器的条目包含私钥证书(叶和中间件,通常是根)都在一个别名下;trustedCert条目(如果有)包含其他方的证书,通常是 CA,每个都使用不同的别名

以编程方式,privateKey 条目链中的不同证书通过keystore.getCertificateChain(alias)[0]= 叶、[1]= 第一个中间体等获得。

在密钥库/信任库中,您可以拥有更多密钥/证书,并且每个密钥都有一个别名。如果必须在服务器中配置 SSL,通常需要配置密钥库、密钥库密码、密钥密码和别名。基本上,您使用别名来引用您打算使用的密钥。

jboss wildfly 8 示例

<security-realm name="SSLClientCertRealm">    
    <server-identities>
        <ssl>
            <keystore path="server-ssl.keystore" relative-to="jboss.server.config.dir" keystore-password="keystore" alias="alias_name" key-password="keystore"/>
        </ssl>
    </server-identities>