除此之外:对于不需要genpkey 然后是pkcs8 -topk8 -nocrypt -outform der 的密钥对; genpkey ... -outform der (without -$cipher) 将创建 PKCS8-clear DER,JCE 直接支持的格式。就此而言,即使是 PKCS8-clear PEM 也可以通过剥离标题和结尾行并解码 base64 来轻松处理。对于 2010 年 1.0.0 之前的 OpenSSL 所需的 其他 命令(genrsa;gendsa;ecparam -genkey),情况并非如此,这是您会发现很多关于这一切的错误建议的部分原因在全球范围内复制。
java.security.KeyStore API 仅支持将 PrivateKey 值与证书链(可以是单个证书)一起存储。它还支持存储单独的证书(以验证来自其他人的签名或加密数据),但不支持单独的公钥。所以是的,您必须创建(或以其他方式获得)证书。
如果您不想要真实证书的安全功能,通常的约定是创建一个“自签名”证书——遵循标准 X.509v3 格式并包含公钥的证书,但由其自己的 密钥(特别是与证书中的公钥匹配的私钥)而不是任何 CA 的密钥签名。 OpenSSL 可以通过几种方式做到这一点,比如通常推荐的
openssl genpkey ... -out priv.pem
openssl req -new -key priv.pem -x509 ... -out cert.pem
或者您可以将密钥生成和证书创建与更简单的结合起来
openssl req -newkey rsa:2048 -keyout priv.pem -nodes -x509 ... -out cert.pem
# this doesn't support all the options of genpkey
# but it does support the simple case you are using
也可以拆分'req'和'sign'步骤:
openssl genpkey ... -out priv.pem
openssl req -new -key priv.pem ... -out csr.pem
openssl x509 -req -in csr.pem -signkey priv.pem ... -out cert.pem
# or
openssl req -newkey rsa:2048 -keyout priv.pem ... -out csr.pem
openssl x509 -req -in csr.pem -signkey priv.pem ... -out cert.pem
然后,您可以编写(简单)代码来读取私钥和证书并创建一个 KeyStore 条目——如果您愿意(您可能会这样做)并坚持下去。然而keytool 不能直接这样做。您可以改为使用openssl pkcs12 -export 将两个 OpenSSL 文件组合成一个 PKCS12 文件,该文件是密码加密的,可直接用作当前支持的 Java 中的密钥库。对于真正的旧 Java,您可能需要使用 keytool -importkeystore -srcstoretype PKCS12 [-deststoretype JKS] ... 将 PKCS12 文件转换为 JKS 文件,这是您会发现被广泛复制的另一条建议。
或者,除非您需要 OpenSSL 文件来做其他事情,否则keytool 可以一次完成整个工作;只需根据需要执行keytool -genkeypair -keyalg rsa -keysize 2048 -keystore $file 以及-validity 和-dname 等其他选项,它将为其生成密钥对和自签名证书并将私钥与自签名证书一起存储在受密码保护的密钥库文件中。 (通过 j8 默认为 JKS,但您可以另外指定;j9+ 默认为 PKCS12。)
但是,证书可能会过期,所以一段时间后我必须总是更新它,还是我错了?
过了一段时间,是的,但那个时间可能是几千年。我怀疑到那时您和第三方都将不复存在,而且可能 Java 将不再存在,因此 Java API 施加的要求将不再重要。请注意,在 32 位系统上的旧版本 OpenSSL——今天每个都很少见,并且组合更罕见——有时会受到“Y2038”问题的影响,而现在只有 18 年的未来——很多 em> 今天使用的系统到那时可能会过时,但不是全部。 Java 使用自己的时间戳格式,从来没有这个问题。
CA 颁发的证书的生命周期通常要短得多,很少超过 1-2 年,有时甚至更短(例如,LetsEncrypt 为 90 天),但这不是证书固有的规范和代码。
我需要创建 2 个证书作为 hack,以便能够将它们存储到 java-keystore 中吗?
是的。确切地说,您当然需要为自己的密钥创建一个(虚拟)证书。对于对方的密钥,如果 他们 创建(虚拟)证书会更容易。你不能为他们创建一个自签名证书,因为你没有他们的私钥——或者至少你不应该。您可以创建一个稍微复杂的结构,在其中创建一个虚拟 CA 并使用它为它们签署证书,然后导入并使用该证书。如果需要,我会扩展,但这正如我所说的更复杂,而设置了许多常用工具来让他们很容易地做到这一点。