我们从技术深度看,Key Usage是证书中的基础权限声明,定义证书公钥的通用功能(如签名、加密等),属于X.509标准的核心字段;而EKU则是更细粒度的应用场景声明(如TLS服务器认证、代码签名等),通过OID扩展实现。用户真正需要了解实际配置路径指导,比如在生成CSR时如何正确设置这些参数。因此理解 SSL证书中的 密钥用途 (Key Usage - KU) 和 扩展密钥用途 (Extended Key Usage - EKU) 对于正确配置和验证证书至关重要。它们定义了证书中的公钥可以用于哪些具体目的,增强了安全性并防止密钥滥用。

以下是两者的详细解释、区别和关联:

一、密钥用途 (Key Usage - KU)

定义: Key Usage 是 X.509 证书标准中的一个基本约束字段。它定义了证书公钥的基本加密操作类型。

位置: 位于证书的 X509v3 extensions 部分,通常是 X509v3 Key Usage。

值类型: 是一个位掩码 (Bitmask),意味着它可以同时设置多个标志位(用逗号分隔)。

主要用途值:

digitalSignature: 公钥可用于验证数字签名(例如,用于 TLS 客户端或服务器身份验证时的签名交换)。

nonRepudiation (contentCommitment): 公钥可用于生成签名,以提供不可否认性(证明特定实体执行了操作)。与 digitalSignature 类似,但更强调法律证据性。许多现代证书将此与 digitalSignature 合并或等同处理。

keyEncipherment: 公钥可用于加密对称密钥或其他密钥材料(在 TLS 握手过程中常见,客户端用服务器证书的公钥加密预主密钥)。

dataEncipherment: 公钥可用于直接加密用户数据(在 TLS/SSL 中极少使用,通常使用对称加密)。

keyAgreement: 公钥可用于密钥协商协议(如 Diffie-Hellman),建立共享密钥。

keyCertSign: 公钥可用于签署其他证书(即该证书属于证书颁发机构 CA)。

cRLSign: 公钥可用于签署证书吊销列表 (CRL)(即该证书属于 CA)。

encipherOnly: 当与 keyAgreement 一起使用时,限制仅用于加密(极少用)。

decipherOnly: 当与 keyAgreement 一起使用时,限制仅用于解密(极少用)。

重要性:

限制密钥的使用范围,防止密钥被用于非预期目的(例如,防止一个仅用于签名的密钥被用来解密数据)。

客户端和服务器在 TLS 握手时会检查 KU 扩展是否符合协议要求。 例如,服务器证书通常需要 digitalSignature 和 keyEncipherment 或 keyAgreement(取决于密钥交换算法),而 CA 证书必须有 keyCertSign。

二、扩展密钥用途 (Extended Key Usage - EKU)

定义: Extended Key Usage 是 X.509 证书标准中的一个扩展字段。它在 KU 定义的基本操作类型基础上,进一步指定公钥可以被用于哪些特定的应用程序或协议场景。它提供了更细粒度的控制。

位置: 位于证书的 X509v3 extensions 部分,通常是 X509v3 Extended Key Usage。

值类型: 是一个对象标识符 (OID - Object Identifier) 列表,每个 OID 代表一个特定的使用目的。

主要用途 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) 响应。

IPSec End System (1.3.6.1.5.5.7.3.5), IPSec Tunnel (1.3.6.1.5.5.7.3.6), IPSec User (1.3.6.1.5.5.7.3.7): 用于 IPSec 相关场景。

Any Extended Key Usage (2.5.29.37.0): 表示证书可用于任何扩展密钥用途(慎用!会降低安全性约束)。

重要性:

提供比 KU 更具体的应用层语义。

允许应用程序或协议根据特定的 OID 来精确地接受或拒绝证书。例如:

一个只配置了 Server Authentication 的 Web 服务器证书,不会被接受用于客户端认证或代码签名。

一个要求客户端证书的 VPN 网关可以明确要求证书包含 Client Authentication EKU。

操作系统和应用程序(如浏览器、邮件客户端、代码签名工具)会严格检查 EKU 是否匹配其预期用途。

三、关键区别与联系

特性 密钥用途 (Key Usage - KU) 扩展密钥用途 (Extended Key Usage - EKU)

层级 基础约束 (定义密钥能做什么 操作) 扩展约束 (定义密钥能用于什么 应用场景)

类型 位掩码 (Bitmask) (多个二进制标志位组合) 对象标识符列表 (OID List) (多个 OID)

粒度 较粗 (加密、签名、证书签名等基本操作类型) 较细 (TLS 服务器认证、客户端认证、代码签名等具体应用)

必要性 通常必须存在,对于终端实体证书和 CA 证书都关键 可选但强烈推荐,提供更精确的应用场景控制

约束关系 EKU 隐含地依赖于 KU。例如,Server Auth 要求 KU 包含 digitalSignature (和/或 keyAgreement) 以及 keyEncipherment (如果是 RSA)。 EKU 必须在 KU 允许的操作范围内。KU 定义了“能做什么”,EKU 在 KU 允许的范围内定义了“在哪些地方做”。

示例值 digitalSignature, keyEncipherment TLS Web Server Authentication, TLS Web Client Authentication

四、在 SSL/TLS 中的典型应用

标准 HTTPS 服务器证书:

KU: 必须包含 digitalSignature。如果使用 RSA 密钥交换,通常也包含 keyEncipherment。如果使用 (EC)DHE 密钥交换,通常包含 keyAgreement。

EKU: 必须包含 Server Authentication (1.3.6.1.5.5.7.3.1)。这是浏览器等客户端验证服务器身份时检查的关键项。

客户端证书 (用于 mTLS 等):

KU: 必须包含 digitalSignature。

EKU: 必须包含 Client Authentication (1.3.6.1.5.5.7.3.2)。服务器会检查此 EKU。

证书颁发机构 (CA) 证书:

KU: 必须包含 keyCertSign(用于签署证书)和 cRLSign(用于签署 CRL)。

EKU: 通常不设置或设置为特定值(如 Any Extended Key Usage),但更安全的做法是为中间 CA 设置特定的 EKU 约束(如只允许签发服务器或客户端证书)。根 CA 通常没有 EKU。

五、总结

Key Usage (KU): 规定公钥能执行的基本加密操作(如签名、加密、签发证书)。是基础安全约束,TLS 实现必须检查。

Extended Key Usage (EKU): 在 KU 的基础上,规定公钥能被用于哪些具体的应用程序或协议目的(如验证 Web 服务器、验证客户端、签名代码)。提供更细粒度的应用层策略控制,现代应用程序和操作系统会严格检查。

协同工作: EKU 依赖于 KU。一个有效的证书必须首先满足 KU 的要求(具备执行所需操作的基本能力),然后其 EKU 会告诉应用程序它是否被允许用于当前的具体场景。KU 定义了“能做什么”,EKU 定义了“能在哪里做”。

实践要点:

为终端实体证书(服务器、客户端)正确设置 EKU (Server Auth, Client Auth) 至关重要,否则证书可能被应用程序或系统拒绝。

CA 证书的 keyCertSign KU 是核心。

在生成证书签名请求 (CSR) 或由 CA 签发证书时,需要根据证书的预期用途仔细配置 KU 和 EKU。

使用 openssl x509 -in certificate.crt -text -noout 命令可以查看证书的 KU 和 EKU 详细信息。

管理者应理解并正确配置 Key Usage 和 Extended Key Usage ,确保SSL证书安全、有效且仅被用于其设计目的的关键环节。