密钥用途 (Key Usage,KU)
定义
密钥用途是 X.509 证书扩展,限定证书公钥可执行的密码学操作,例如数字签名、密钥加密或签发证书。
密钥用途(Key Usage)是 RFC 5280 定义的位串,共九个标志:digitalSignature、nonRepudiation(又称 contentCommitment)、keyEncipherment、dataEncipherment、keyAgreement、keyCertSign、cRLSign、encipherOnly 和 decipherOnly。它描述底层的密码学操作,而 扩展密钥用途 描述“用于 TLS 服务器认证”这类应用层目的。CA 证书使用 keyCertSign 和 cRLSign;TLS 服务器证书使用 digitalSignature,RSA 密钥还常带 keyEncipherment。
为什么重要
扩展存在时客户端就会强制检查,而且它通常被标记为关键,所以标志写错,证书其他方面再正确也会验证失败。标志应与密钥类型和协议对应:ECDSA 密钥用于签名握手数据,需要 digitalSignature;keyEncipherment 是为老式 RSA 密钥交换准备的,即客户端用服务器的 RSA 公钥加密预主密钥。TLS 1.3 已删除这种密钥交换,因此在 TLS 1.3 中 RSA 证书也只用于签名。自己用 OpenSSL 签发内网证书时,漏写或乱写这一扩展是很常见的错误。
例子
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
这是 RSA 服务器证书的典型写法;ECDSA 服务器证书通常只显示 Digital Signature。
常见误区
- KU 和 EKU 是一回事。 KU 限制密码学操作,EKU 限制应用用途,两者同时存在时都必须允许该用法。
- TLS 1.3 需要 keyEncipherment。 TLS 1.3 从不用证书密钥做加密,关键的是 digitalSignature。