用于 TLS/SSL 和身份(签名)的证书之间有区别吗?

Is there a difference between certificates used for TLS/SSL and Identity (signing)?

证书之间是否有区别,比如来自 Apple 的签名或 Let's Encrypt TLS/SSL?它们是否可以互换,或者在生成时是否具有特定的参数,使一个有利于 ID,一个有利于加密?

根据您的意思,它们要么完全相同,要么不同。 (语言不是很宏大吗?)

代码签名证书和 TLS 服务器证书以及 TLS 客户端证书都是 X.509 Public 密钥证书,由 IETF RFC 5280 and ITU-T X.509(名称的由来)描述。

在证书中有一组(可选的)扩展(定义明确的扩展是对以前数据版本的刚性结构的扩展)。这些扩展之一称为扩展密钥使用(令人困惑的是,在 .NET 中由 X509EnhancedKeyUsageExtension 描述),通常缩写为 EKU。 EKU 扩展名只是一个标识符列表,用于指示证书的有效用途。 (像 CA/Browser 论坛这样的组织提出了 CA 在允许声明每种特定类型的目的之前必须做什么的规则。)

我看到的 whosebug.com 当前证书有两个列出的用途:1.3.6.1.5.5.7.3.1 and 1.3.6.1.5.5.7.3.2。不过,这些标识符对一般人来说意义不大,因此许多系统会用更友好的名称替换它们。 Firefox 89 的描述是“服务器认证,客户端认证”。

TLS/SSL 对 EKU 采取宽松的方法:如果证书有 EKU 扩展,则 TLS 服务器 (1.3.6.1.5.5.7.3.1) 或 TLS 客户端 (1.3.6.1.5.5.7.3) .2) 目的必须存在(对于它所扮演的角色而言是正确的),但如果 EKU 扩展不存在则证书是可以接受的。

RFC 3161 Timestamping is less lax. It requires that the certificate have an EKU extension (and only one of them, which can contain multiple purpose values) which contains the purpose 1.3.6.1.5.5.7.3.8, in section 2.3.

因此,差异仅在于 EKU 值。

  • TLS 服务器:1.3.6.1.5.5.7.3.1
  • TLS 客户端:1.3.6.1.5.5.7.3.2
  • 代码签名:1.3.6.1.5.5.7.3.3
  • 时间戳:1.3.6.1.5.5.7.3.8

还有很多其他通用的,比如1.3.6.1.4.1.311.10.3.5(微软Windows硬件质量实验室驱动程序验证),它们并不都是以“1.3.6.1开头.5.5.7.3。” (尽管有很多常见的)。