无法生成密钥库来签名,keystool和oppen之间有什么区别

时间:2016-12-20 16:19:48

标签: java ssl keytool

我正在尝试生成一个密钥和CSR,我可以使用我的root密钥签名。 我找到了两个方法,但无法弄清楚它们的区别:

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

两者有什么区别?我在签署证书时不能同时使用?

1 个答案:

答案 0 :(得分:3)

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

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

Java:

keytool -genkeypair为该密钥对生成密钥对和“虚拟”(自签名)证书,并将它们(一起)存储在密钥库中。即使自签名证书在使用之前通常会被“真正的”CA颁发的证书(通常是链)替换,但它是因为KeyStore的Java API需要它而创建的;这就是-genkeypair 提示输入多个名称字段的原因(除非您指定-dname)。 Java支持几种密钥库;通过Java 8,默认是一个JKS格式文件虽然计划在Java 9中进行更改。一个JKS文件可以包含多个条目,每个条目包含一个密钥和一个证书链为自己组合或“受信任的”证书,通常是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密钥库,可以更灵活地使用它。)

<强> OpenSSL的:

openssl genrsa仅生成 密钥对(无证书)并将其写入文件,该文件仅包含私有密钥,默认情况下为PEM格式但您可以指定-outform der;这使用PKCS1 CRT格式,它有效地包含了publickey。默认情况下,此文件未加密,但对于PEM(而非DER),您可以指定密码以对其进行密码加密 - 但使用的是OpenSSL的“遗留”PBE,这很差。 PEM文件是基于文本的,可以部分阅读,至少足以识别它们,使用文本编辑器或cat等而不是像keytool这样的特殊程序。

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

当您从CA获得证书时,OpenSSL程序通常要求您提供私钥和匹配证书,通常还要提供某些文件组合中的链证书 - 有时一个,有时两个,有时三个或者更。您可能负责跟踪哪个密钥与哪个证书(通常可以通过合适的文件名完成)以及如果您有多个密钥和证书组合,您始终负责跟踪哪个是哪个(同上)。如果要在非OpenSSL程序中使用此密钥和证书,则需要转换为更标准的PKCS12表单,该表单将密钥和证书组合在一个文件中。

您可以使用较新的(但更复杂的)-subj代替openssl genpkey;这将privatekey文件写入'new'(自大约2000!)PKCS8格式,默认情况下再次在PEM中,但可选择DER。默认情况下,这是未加密的,但如果选择加密,则PKCS8 PBE优于genrsa使用的“传统”PBE。您还可以使用genrsa或(自1.0.0)openssl pkcs8 -topk8将旧版私钥文件转换为PKCS8。只要您使用默认PEM,读取privatekeys的OpenSSL程序就可以透明地读取 legacy或PKCS8。

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