无法生成密钥库进行签名,keystool 和 oppen 有什么区别

Can't generate a keystore to sign, what is the difference between keystool and oppen

我正在尝试生成一个密钥和 CSR,我可以使用我的根密钥对其进行签名。 我找到了两种方法,但不知道有什么区别:

1) you can generate a keystore using key tool and then it's CSR.
keytool -genkey -alias [enter_alias_name] -keyalg RSA -keystore [enter_keystore_name] -keysize 2048
2)keytool -certreq -alias [alias_name] -file certreq.csr -keystore

或者使用openssl生成一个'key'

1)openssl genra -out device.key 2048
2)openssl req -new -key device.key -out device.csr

两者有什么区别?签证书的时候不能都用到吗?

TLDR:这是本地使用的文件格式; CSR本身基本相同。

首先,题外话:颁发证书并不是签署 CSR。证书可以基于 CSR,但它是由证书颁发机构的密钥签名的证书,它可能是也可能不是根 CA 密钥。

Java:

keytool -genkeypair 为该密钥对生成一个密钥对和一个 'dummy'(自签名)证书,并将它们(一起)存储在密钥库中。尽管自签名证书在使用前通常会被 'real' CA 颁发的证书(通常是链)替换,但它的创建是因为 KeyStore 的 Java API 需要它;这就是为什么 -genkeypair 提示输入多个名称字段 (除非您指定 -dname)。 Java 支持多种密钥库;通过 Java 8 默认是一个 JKS 格式的文件 虽然这计划在 Java 9 中改变。一个 JKS 文件 可以包含多个条目,每个条目都包含一个密钥加证书链组合,用于您自己或一个 'trusted' 证书,通常是一个 CA 根,用于其他人。 JKS 中的 私钥使用密码加密 ,整个 JKS 也使用密码进行保护 (MACed)。这些被指定为 keypassstorepass 并且可以不同,但​​默认情况下是相同的,因此提示 Enter key password for <alias> (RETURN if same as keystore password)

keytool -certreq 为密钥库中的密钥创建一个 CSR,默认情况下使用 来自 密钥库中的虚拟证书的主题 名称,尽管您可以指定 -dname 来更改它。

如果您随后获得由使用该 CSR 的 CA 颁发的证书,您可以使用 keytool -importcert 将其与任何需要的链证书一起安装到密钥库中。 Java 程序然后使用密钥库条目来执行诸如实现 TLS(包括 HTTPS)服务器之类的操作。但是,您无法轻易地从 JKS 密钥库中获取私钥并将其用于 Java 程序之外的任何其他用途。 (可以转换为PKCS12 keystore,使用起来更灵活)

OpenSSL:

openssl genrsa 生成 密钥对(无证书)并将其写入仅包含私钥的 文件,采用 PEM 格式 默认情况下,但您可以指定 -outform der 代替;这使用 PKCS1 CRT 格式,它有效地包含公钥。默认情况下,此文件 未加密 ,但对于 PEM(而非 DER),您可以指定密码以对其进行密码加密——但使用 OpenSSL 的 'legacy' PBE,即较差的。 PEM 文件是基于文本的,可以部分读取,至少足以识别它们,使用文本编辑器或 cat 等而不是像 keytool.

这样的特殊程序

openssl req -new 为给定的密钥对创建一个 CSR;它通常 提示输入名称字段 ,类似于 keytool -genkeypair,以及一些其他字段。名称字段提示由您使用的配置文件控制,可以是默认的一个或您使用 -config 指定的一个,因此您可以根据需要从标准列表中更改,或者您可以使用 -subj 在命令行上覆盖它。 OpenSSL 能够在 CSR 中包含扩展和一些 'attributes' 之类的 challengePassword,而 Java 则不能,但是很少有 CA 接受这些字段。

当您从 CA 取回证书时,OpenSSL 程序通常要求您提供私钥和匹配的证书,通常还包括一些文件组合中的链证书——有时一个,有时两个,有时三个甚至更多。您可能负责跟踪哪个密钥与哪个证书(通常可以使用合适的文件名来完成),如果您有多个密钥和证书组合,您始终负责跟踪哪个是哪个(同上)。如果你想在非 OpenSSL 程序中使用这个密钥和证书,你需要转换为更标准的 PKCS12 形式,它将密钥和证书组合在一个文件中。

您可以使用更新的(但更复杂的)openssl genpkey 代替 genrsa;这会将私钥文件写入 'new'(大约从 2000 年开始!)PKCS8 格式,同样默认为 PEM,但也可以选择 DER。同样,默认情况下,这未加密,但如果您 select 加密,PKCS8 PBE 优于 genrsa 使用的 'legacy' PBE。您还可以使用 openssl pkcs8 -topk8 或(自 1.0.0 起)openssl pkey 将遗留私钥文件转换为 PKCS8。只要您使用默认的 PEM,读取私钥的 OpenSSL 程序可以透明地读取 旧版或 PKCS8。

您也可以使用 openssl req -newkey rsa[:bits] [-keyout file] ... 将这些步骤合二为一。括号中的项目可以从配置文件中提供,对于现代版本(从 2010 年的 1.0.0 开始),它使用新的 PKCS8 文件格式,并且默认加密文件。参见 https://security.stackexchange.com/questions/93417/what-encryption-is-applied-on-a-key-generated-by-openssl-req