丢失密钥库密码,我有什么选择?

Lost keystore password, what are my options?

我有一个密钥库,用于生成一些 .csr 文件,发送这些文件并取回 .p7b 文件。但是我设法丢失了我的密钥库密码,我看到有一个蛮力 java 程序可以解决这个问题,但是我知道我的密码有 15 个字符长,这需要很长时间。我也尝试从旧的密钥库创建一个新的密钥库,就像一些人建议的那样,但它仍然需要我输入密码并且没有它会失败。

如果我只是创建一个新的密钥库并将证书导入该密钥库,我是否可能 运行 遇到问题,或者我是否必须申请新证书?

Am I likely to run into problems if I just create a new keystore and import the certificates into that one

你会运行陷入你做不到的问题。您已无法访问私钥。

or do I have to request new certificates?

您必须创建一个新的密钥库、密钥对、CSR,对其进行签名、导入,...

其实有点复杂。尽管名称如此,但 Java 'keystore' 实际上可以包含以下任意组合:

  • PrivateKeyEntry -- 包含私钥匹配的证书或链,用于证明你自己的身份,特别是对于SSL/TLS服务器

  • TrustedCertEntry -- 包含证书,通常是根 CA 证书,用于验证 other 方,包括 SSL/TLS 客户端验证服务器( s)

  • (仅在某些格式中,不常见的 JKS)SecretKeyEntry -- 此处不相关

参见 the javadoc for java.security.KeyStore。事实上,SSL/TLS(包括 HTTPS)客户端在 Java 中用于验证服务器的 CA 证书 'truststore' 通常是密钥库文件,默认情况下 JRE/lib/security/cacerts 作为一部分提供JRE 的(对于 Oracle-formerly-Sun 软件包)或从它链接(对于 OpenJDK,至少在我使用的系统中)。

因此,如果您告诉 keytool 将您自己的证书导入新的密钥库文件,它会这样做——但作为可以识别其他人的可信证书条目,而不是作为可以识别您身份的私钥条目。唯一的指示是一个微妙的指示:keytool 会说 Certificate was added(这意味着一个受信任的证书)而不是 Certificate reply was installed(这意味着一个匹配的私钥)。

如果您随后将此 cert-only-not-privatekey 密钥库用于 SSL/TLS 服务器,它不会立即或明显地给出错误;通常它会以 'no cipher suites in common' 的形式拒绝所有连接尝试。 (如果两个端点都配置为允许 'anonymous' 密码套件,则连接 will/may 可以通过匿名套件成功,但这不能提供针对现在常见的主动攻击的安全性,因此通常不会这样做。)

但这不会改变结果:没有密码短语,因此无法访问旧的私钥,您将陷入困境,必须重新开始。请注意,如果您使用付费 CA,其中许多(大多数 IME)允许 'rekeying' 免费或以大幅折扣获得相同域名的证书。