我使用以下命令创建了一个密钥对:
"%JAVA_HOME%\bin\keytool" -genkeypair -keysize 2048 -alias tomcat -keyalg RSA -sigalg SHA256withRSA
我注意到 jdk/lib/security 文件夹中有一个密钥库,jre/lib/security 文件夹中还有另一个密钥库。我假设其中一个存储将保存我刚刚创建的密钥对。密钥对是在登录用户目录中创建的默认密钥库中创建的。
我的第一个问题是为什么默认密钥库位于用户目录中?这似乎很奇怪。我可以移动该密钥库吗?
我的第二个问题是为什么有这么多的密钥库?
我的最后一个问题是,既然我的密钥对是默认存储中的唯一密钥,我是否应该将其移动/复制到其他地方?我需要由 ICA 对其进行签名,因此单独使用它似乎不太合适。
答案1
Java 每次更新时都会覆盖默认密钥库(嗯,大多数情况下它会安装在新位置并删除前一个位置),因此每次更新软件包时,它都会删除用户创建的任何私钥(因为更新还可能包含默认信任库中的更改以删除不受信任的 CA 等),因此默认(也是最明智的方式)是将内容存储在用户的文件夹中。这样它就与更新隔离了。此外,如果同一台计算机上的每个用户都可以访问任何其他用户的私钥或操纵默认信任库以允许自定义 CA,这将是一个安全问题。
Windows 证书的行为方式类似:默认显示当前用户的个人存储。新的私钥或受信任的证书只会影响当前用户,但机器仍将保留 Windows 附带的默认设置(并且每次更新都会更改这些默认设置,例如新的 CA 或不受信任的 CA)。
用户所做的事情不应该影响同一台机器上的任何其他用户。
至于 JRE 和 JDK,前者用于环境running
(即用于应用程序的标准用法),而后者用于环境,development
并且具有不同的需求。应用服务器需要 JDK,因为它需要*.jsp
动态“编译”页面。JDK 包含自己的 JRE,因此它拥有 JRE 工作所需的一切的副本。由于您可能需要为客户端(用户)提供与服务器不同的支持(即 JRE 和 JDK 可能使用不同的版本),因此共享通用部分可能会造成干扰。
您可以在输入的同一命令中更改密钥库(名称和位置)-keystore file.jks
,但您需要在任何其他命令或配置中引用同一文件,以便 Java 使用同一密钥库。由于您已命名别名tomcat
,我假设您将使用它作为应用程序服务器的密钥库,因此在 server.xml(或 catalina.xml)文件中,您需要配置密钥库位置。
服务器的密钥库应位于具有受限访问权限的目录中(仅服务器正在运行的用户可读),例如等/etc/ssl/
。
至于文件本身的内容,因为您需要对其进行签名,所以首先要创建一个自签名密钥对(如您所做),然后创建一个 CSR(证书签名请求)发送给 CA。之后,您应该将整个链(新签名的证书和 CA 的证书链)导入到同一密钥库中的同一别名中。这仍然是密钥库中的单个条目,但该别名下将有多个证书(和一个私钥)。
如果您的服务器不需要连接到另一台服务器,则该密钥库不应包含任何其他证书。即使需要,您也应该有一个单独的信任库(第二个密钥库,但其中只包含 CA,就像 cacerts 文件一样)(或依赖 JRE 的默认信任库,甚至将 CA 包含在同一个密钥库中)。