SSL 证书中的 密钥用途 (Key Usage) 和 扩展密钥用途 (Extended Key Usage, EKU) 是两个至关重要的 X.509 证书扩展字段。它们共同定义了证书所包含的公钥可以用于哪些具体的密码学操作,以及在哪些特定的应用场景中使用。

理解它们的关系和区别对于正确部署和管理证书至关重要

下面说一下二者的作用和相互关系。

1. 密钥用途 (Key Usage - KU) 

目的: 定义公钥可以执行的基本密码学操作类型。它限制了密钥的根本能力。 

位置: X.509 证书的标准扩展字段之一 (keyUsage)。 

格式: 一个位串 (bit string),每个位代表一种特定的操作权限。证书颁发机构 (CA) 在签发证书时设置这些位。 

常见的 Key Usage 标志位: 

digitalSignature: 密钥可用于执行数字签名操作(验证数据完整性和来源)。这是服务器和客户端证书的核心用途。 

nonRepudiation: 密钥可用于提供不可否认性(签名者事后不能否认签名)。有时与 digitalSignature 合并或替代使用,但在现代 TLS 中较少单独强调。 

keyEncipherment: 密钥可用于加密其他密钥(例如,在 RSA 密钥交换过程中,加密客户端生成的预主密钥)。这是 RSA 密钥服务器证书的核心用途。 

dataEncipherment: 密钥可用于直接加密用户数据(在 TLS 中几乎不使用,因为对称加密效率更高)。 

keyAgreement: 密钥可用于密钥协商协议(例如,在 ECDH 密钥交换过程中)。这是 ECC 密钥服务器证书的核心用途。 

keyCertSign: 密钥可用于签署其他证书(即,这是一个 CA 证书)。

cRLSign: 密钥可用于签署证书吊销列表 (CRL)。 

encipherOnly: 当 keyAgreement 被设置时,此密钥仅可用于加密数据(在 TLS 中极少见)。 

decipherOnly: 当 keyAgreement 被设置时,此密钥仅可用于解密数据(在 TLS 中极少见)。 

关键点: 

约束性强: 如果 Key Usage 扩展存在,证书的公钥只能用于其中标记为允许的操作。尝试执行未授权的操作(如用仅标记 keyEncipherment 的密钥去签名)会失败。 

基础能力: 它定义了密钥能“做什么”(签名、加密密钥、协商密钥等)。 

依赖密钥类型: 不同的密钥算法(RSA, ECC)支持的 Key Usage 不同。例如,ECC 密钥通常使用 digitalSignature 和 keyAgreement,而 RSA 密钥使用 digitalSignature 和 keyEncipherment 来实现 TLS 握手。 

通常必需: 对于终端实体证书(如服务器证书、客户端证书),Key Usage 扩展通常是必需的。

2. 扩展密钥用途 (Extended Key Usage - EKU) 

目的: 定义公钥可以用于的具体应用场景或协议。它指定了证书的预期用途,是对 Key Usage 的进一步细化和约束。 

位置: X.509 证书的标准扩展字段之一 (extendedKeyUsage)。 

格式: 一个对象标识符 (OID) 列表。每个 OID 代表一个特定的使用目的。 

常见的 Extended Key Usage OID: 

Server Authentication (1.3.6.1.5.5.7.3.1): 证书可用于验证 TLS/SSL 服务器的身份(如 HTTPS 网站)。 

Client Authentication (1.3.6.1.5.5.7.3.2): 证书可用于验证 TLS/SSL 客户端的身份(如 VPN 客户端、邮件客户端)。 

Code Signing (1.3.6.1.5.5.7.3.3): 证书可用于对可执行代码、脚本、固件等进行数字签名。 

Email Protection (1.3.6.1.5.5.7.3.4): 证书可用于 S/MIME 邮件签名和加密。 

Time Stamping (1.3.6.1.5.5.7.3.8): 证书可用于签发可信时间戳。 

OCSP Signing (1.3.6.1.5.5.7.3.9): 证书可用于签署 OCSP 响应。 

Any Extended Key Usage (2.5.29.37.0): 证书可用于任何 EKU 定义的目的(慎用,安全性降低)。 

关键点: 

细化场景: 它定义了密钥“用于什么”(用于服务器认证、客户端认证、代码签名等)。 

依赖 Key Usage: EKU 不替代 Key Usage。它是在 Key Usage 允许的基本操作基础上,进一步限制这些操作可以用在哪些具体场景。例如: 

一个具有 EKU Server Authentication 的证书,其 Key Usage 必须包含 digitalSignature (对于 ECDSA 签名或 RSA-PSS/PKCS#1.5 签名) 和/或 keyEncipherment (对于 RSA 密钥交换) 或 keyAgreement (对于 ECDH 密钥交换)。EKU 本身并不赋予这些基础能力。 

可选但推荐: EKU 扩展在技术上是可选的。然而: 

现代实践强烈推荐: 对于服务器证书,几乎总是包含 Server Authentication EKU。对于客户端证书,包含 Client Authentication。 

客户端验证: 许多 TLS 客户端(如 Web 浏览器、操作系统库)在验证服务器证书时,会检查 EKU 是否包含 Server Authentication。如果缺少或包含不匹配的 EKU,可能导致连接失败(即使 Key Usage 正确)。这是防止证书被滥用于非预期场景的重要安全机制。 

特定应用要求: 像代码签名、文档签名、S/MIME 等应用通常严格要求对应的 EKU。

Key Usage (KU) 与 Extended Key Usage (EKU) 的关系总结

1. 基础与细化: Key Usage 定义了密钥能做什么(签名、加密密钥等基本密码学操作)。Extended Key Usage 定义了密钥用于什么(服务器认证、客户端认证等具体应用场景)。

2. 约束层级: 

证书的公钥必须具有执行目标操作所需的 Key Usage 权限(第一道闸门)。 

如果 EKU 扩展存在,证书的公钥还必须在其 EKU 列表中包含目标应用场景对应的 OID(第二道闸门)。 

证书的使用必须同时满足 Key Usage 和 EKU (如果存在) 的限制。

3. 依赖关系: EKU 指定的用途隐含地要求对应的 Key Usage 位被设置。例如 Server Authentication EKU 要求 digitalSignature 和/或 keyEncipherment/keyAgreement 被设置。

4. 安全目标: 两者共同作用,实施最小权限原则:

防止误用: 防止一个只能用于签名的密钥被用于加密,或者一个用于代码签名的证书被用于建立 HTTPS 连接。

增强安全性: 即使攻击者获取了私钥,如果证书的 KU/EKU 严格限制了用途,其能造成的破坏也有限。

SSL证书中的典型应用 

Web 服务器证书: 

Key Usage: digitalSignature, keyEncipherment (RSA 密钥) 或 digitalSignature, keyAgreement (ECC 密钥)。 

EKU: Server Authentication (1.3.6.1.5.5.7.3.1)。这是浏览器验证服务器身份的关键依据。 

客户端证书: 

Key Usage: digitalSignature. 

EKU: Client Authentication (1.3.6.1.5.5.7.3.2)。服务器用它来验证客户端身份。 

代码签名证书: 

Key Usage: digitalSignature. 

EKU: Code Signing (1.3.6.1.5.5.7.3.3)。操作系统或运行时环境验证软件来源和完整性时检查此 OID。 

中间 CA / 根 CA 证书: 

Key Usage: keyCertSign, cRLSign (通常)。 

EKU: 通常不设置或设置为 Any Extended Key Usage(不推荐)或特定于 CA 用途的 OID(较少见)。它们的主要职责是签发证书,而不是直接参与终端实体协议。

上面所述就是二者在SSL证书中的作用以及二者之间的关系。理解 Key Usage 和 Extended Key Usage 对于正确配置、部署和验证 SSL/TLS 证书至关重要。Key Usage 规定了公钥的基本密码学能力(能做什么),而 Extended Key Usage 规定了公钥的具体应用场景(用于什么)。两者协同工作,通过实施最小权限原则来增强整个 PKI 生态系统的安全性,防止证书被滥用。在配置证书时,务必确保这两项扩展的设置与应用场景严格匹配。尤其是在服务器证书中,Server AuthenticationEKU 是现代 TLS 客户端连接成功的关键要求之一。