无法生成密钥库进行签名,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)。这些被指定为 keypass
和 storepass
并且可以不同,但默认情况下是相同的,因此提示 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。
我正在尝试生成一个密钥和 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)。这些被指定为 keypass
和 storepass
并且可以不同,但默认情况下是相同的,因此提示 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。