使用密钥工具的密钥对和自签名证书之间的区别?

Difference between key pair and self signed certificate using keytool?

阅读一些 URL 后发现以下命令用于创建 public/private 密钥对是很常见的。

 keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -storepass password

然后它继续并指示以下命令用于创建自签名证书。

 keytool -genkey -alias selfsigned -keyalg RSA -keystore keystore.jks -storepass password -validity 360

据我所知,唯一的区别是添加了“-validity 360”。

问题 1 - 仅添加“-validity 360”是否会从生成密钥对更改为自签名证书?

问题 2 - "key pairs" 和 "self-signed certificate" 本质上是同义词吗?

问题 3 - 密钥对或 "self-signed certificate" 可以用于官方 CSR 吗?

你说得对,自签名证书和CSR请求都是以keytool -genkey命令开头的。不同之处在于你接下来要用它做什么。

对于自签名证书,没有太多事情要做。您可以导出它,在客户端安装为受信任的证书,使用 keytool -export:

keytool -export -alias selfsigned -file selfsigned.cer -keystore keystore.jks -storepass password 

对于 CSR 请求,您可以使用 keytool -certreq:

创建它
keytool -certreq -alias mydomain -file mydomain.csr -keystore keystore.jks -storepass password

有效期由你决定。这对任何一条路线都不重要,但使用自签名证书通常需要超过默认的 90 天。

Question 1 - Does simply adding "-validity 360" change from generating a key pair to a self-signed certificate?

没有。 -genkeypair(大约 2005 年以来的官方名称)或不太准确的同义词 -genkey 总是生成一个密钥对 自签名证书,并存储私钥和证书 (一起)在密钥库中。 -validity 360 唯一的区别是有效期是使用指定值还是默认值。

Question 2 - Are "key pairs" and "self-signed certificate" essentially synonymous?

没有。在这种情况下,它们是联系在一起的,但它们是不同的东西。密钥对,以及单独的私钥和 public 密钥,可以用于某些没有任何证书(自签名或其他)的东西,使用存储 other 而不是 Java 密钥库,并且自签名证书(包括 public 密钥)可以在没有私钥的情况下用于某些事情。例如,SSH 通常使用 'bare' 密钥对进行服务器身份验证,并经常用于客户端身份验证。 PGP 使用签名的 public 密钥格式,作为一种证书,但与 Java 密钥库中使用的 X.509/PKIX 证书非常不同,SSL/TLS/HTTPS/etc 和代码签名(和 SMIME)。

作为在 travel.SX 上经常出现的类比,考虑一张机票和一箱衣服。传统上,当您购买机票时,它包括携带一定数量的行李的能力,通常是几个不超过重量限制的手提箱,在您的航班上随身携带——尽管现在这种方式因广泛不受欢迎和有争议的方式而有所不同。如果您愿意,可以不带手提箱乘坐飞机,尽管这意味着您在目的地可能没有任何衣服可穿。在许多飞机以外的地方,例如汽车、出租车、公共汽车、火车或亲戚家,也有可能并且相当普遍地使用手提箱携带没有机票的衣服朋友家。

Question 3 - could either the key pair or "self-signed certificate" be used for an official CSR?

如果您从其他来源提供主题名称,则可以使用密钥 生成 CSR(*)。但是 Java 密钥库实际上并不存储密钥 加上自签名证书,而是 私钥 加上自签名证书 (或其他证书); public 密钥 可访问地 仅存储在证书中,需要 public 密钥(来自证书)并用于生成 CSR。

自签名证书或任何其他证书本身不能用于生成 CSR(*),因为 CSR 必须使用私钥签名。

(*) 其实CSR是一个笼统的概念,CSR的种类很多,规则也不尽相同。我在这里只讨论 PKCS10 aka RFC2986 et rel 指定的那种 CSR,这是(唯一)由 Java 和大多数其他常用工具生成的,也是几乎所有 Internet CA 都需要的。