OpenSSL CA keyUsage 扩展

Xen*_*hic 29 certificate ssl openssl

我想建立一个证书链,在顶部有一个自签名的“根”CA,用于签署子 CA,然后可以签署客户端和服务器证书。设置时openssl.cnf,我注意到一个keyUsage参数,显然需要将其设置为应该使用的任何密钥。虽然记录了参数值,但我找不到有关在某些情况下使用哪些参数值的任何信息。

这些keyUsage值是什么意思,在以下情况下我应该使用什么?

  • 自签名根 CA
  • 中间 CA(可以签署其他 CA)
  • 中间 CA(不能签署其他 CA)
  • 非 CA 证书

此外,是否需要使用某些值指定其他扩展名,例如nsCertType?

JW0*_*914 74

证书颁发机构和中间 CA


自签名 CA

  • 密钥用法: cRLSign ,digitalSignature,keyCertSign

    • 不应包含任何其他 KU 或 EKU
  • V3简介:

      [ v3_ca ]
      basicConstraints        = critical, CA:TRUE
      subjectKeyIdentifier    = hash
      authorityKeyIdentifier  = keyid:always, issuer:always
      keyUsage                = critical, cRLSign, digitalSignature, keyCertSign
      subjectAltName          = @alt_ca
    
    Run Code Online (Sandbox Code Playgroud)

中级 CA

  • 密钥用法: cRLSign ,digitalSignature,keyCertSign

    • 不应包含任何其他 KU 或 EKU
  • V3简介:

      [ v3_ica ]
      basicConstraints        = critical, CA:TRUE, pathlen:1
      subjectKeyIdentifier    = hash
      authorityKeyIdentifier  = keyid:always, issuer:always
      keyUsage                = critical, cRLSign, digitalSignature, keyCertSign
      subjectAltName          = @alt_ica
    
    Run Code Online (Sandbox Code Playgroud)
    • 其中pathlen:等于它可以签署的 CA/ICA 的数量
    • 如果pathlen:设置为 0,则不能签署其他 CA/ICA


非 CA 证书


虚拟专用网服务器

  • 密钥用法: nonRepudiation ,digitalSignature,keyEncipherment,keyAgreement

  • V3简介:

      [ v3_vpn_server ]
      basicConstraints        = critical, CA:FALSE
      subjectKeyIdentifier    = hash
      authorityKeyIdentifier  = keyid:always, issuer:always
      keyUsage                = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement 
      extendedKeyUsage        = critical, serverAuth
      subjectAltName          = @alt_vpn_server
    
    Run Code Online (Sandbox Code Playgroud)

VPN客户端

  • 密钥用法: nonRepudiation ,digitalSignature,keyEncipherment

  • V3简介:

      [ v3_vpn_client ]
      basicConstraints        = critical, CA:FALSE
      subjectKeyIdentifier    = hash
      authorityKeyIdentifier  = keyid:always, issuer:always
      keyUsage                = critical, nonRepudiation, digitalSignature, keyEncipherment
      extendedKeyUsage        = critical, clientAuth
      subjectAltName          = @alt_vpn_client
    
    Run Code Online (Sandbox Code Playgroud)


密钥用法


仅限加州

keyCertSign

  • 主题公钥用于验证证书上的签名
  • 此扩展只能用于 CA 证书

cRLSign

  • 主题公钥用于验证撤销信息的签名,例如 CRL
  • 此扩展只能用于 CA 证书

digitalSignature

  • 证书可用于应用数字签名
    • 数字签名通常用于具有完整性的实体身份验证和数据源身份验证

nonRepudiation

  • 证书可用于上述数据签名,但证书公钥可用于提供不可否认服务
    • 这可以防止签名实体错误地拒绝某些操作

keyEncipherment

  • 证书可用于加密对称密钥,然后将其传输到目标
    • 目标解密密钥,随后使用它来加密和解密实体之间的数据

dataEncipherment

  • 证书可用于加密和解密实际应用程序数据

keyAgreement

  • 证书允许使用密钥协商协议与目标建立对称密钥
  • 然后可以使用对称密钥来加密和解密实体之间发送的数据

encipherOnly

  • 公钥仅用于在执行密钥协商时对数据进行加密
    • 要求。库: keyAgreement

decipherOnly

  • 公钥仅用于在执行密钥协商时解密数据
    • 要求。库: keyAgreement

RFC 5280 [4.2.1.3]

id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 }

  • 位串是十六进制

      KeyUsage ::= BIT STRING {
          digitalSignature    (0),
          nonRepudiation      (1),
          keyEncipherment     (2),
          dataEncipherment    (3),
          keyAgreement        (4),
          keyCertSign         (5),
          cRLSign             (6),
          encipherOnly        (7),
          decipherOnly        (8)
      }
    
    Run Code Online (Sandbox Code Playgroud)


扩展密钥使用


serverAuth

  • 所有 VPN 服务器都应使用此 EKU 进行签名
    • SSL/TLS Web/VPN 服务器身份验证 EKU,区分客户端可以对其进行身份验证的服务器
    • 这将取代nscertype选项(ns innscertype代表 NetScape [浏览器])
    • 要求。KU: digitalSignature ,keyEnciphermentkeyAgreement

clientAuth

  • 所有 VPN 客户端都必须使用此 EKU 进行签名
    • SSL/TLS Web/VPN 客户端认证 EKU 仅将客户端区分为客户端
    • 要求。KU: digitalSignature和/或keyAgreement

codeSigning

  • 代码签名
    • 要求。KU: digitalSignature , nonRepudiation, 和/keyEnciphermentkeyAgreement

emailProtection

  • 通过 S/MIME 的电子邮件保护,允许您发送和接收加密的电子邮件
    • 要求。KU: digitalSignature ,keyEnciphermentkeyAgreement

timeStamping

  • 可信时间戳
    • 要求。库: digitalSignaturenonRepudiation

OCSPSigning

  • OCSP 签名
    • 要求。库: digitalSignaturenonRepudiation

msCodeInd

  • Microsoft 个人代码签名(验证码)
    • 要求。KU: digitalSignature ,keyEnciphermentkeyAgreement

msCodeCom

  • 微软商业代码签名(验证码)
    • 要求。KU: digitalSignature ,keyEnciphermentkeyAgreement

mcCTLSign

  • Microsoft 信任列表签名
    • 要求。库: digitalSignaturenonRepudiation

msEFS

  • Microsoft 加密文件系统签名
    • 要求。KU: digitalSignature ,keyEnciphermentkeyAgreement

!!!不应该使用!!!

ipsecEndSystem, ipsecTunnel, &ipsecUser

  • 1999 年分配,这些值的语义从未明确定义
  • RFC 4945:这三个 EKU 值的使用已过时,本规范明确弃用 [ 5.1.3.12 ]

ipsecIKE

  • IPSec Internet 密钥交换
  • 我相信这和上面三个在同一条船上
    • 需要进行研究以确定是否也应不再使用此 EKU
  • clientAuth 可以在 IPSec VPN 客户端证书中使用

RFC 5280 [4.2.1.12]

anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 }

  • id-kp OBJECT IDENTIFIER ::= { id-pkix 3 }

    • id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 }

      • TLS 服务器身份验证
        • KU 位用于:
          digitalSignature,keyEnciphermentkeyAgreement

    • id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 }

      • TLS 客户端身份验证
        • KU 位用于:
          digitalSignature和/或keyAgreement

    • id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 }

      • 签署可下载的可执行代码
        • KU 位用于:
          digitalSignature

    • id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 }

      • 电子邮件保护
        • KU 位用于:
          digitalSignature, nonRepudiation, 和/或keyEnciphermentkeyAgreement

    • id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 }

      • 将对象的哈希绑定到时间
        • KU 位用于:
          digitalSignature和/或nonRepudiation

    • id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 }

      • 签署 OCSP 响应
        • KU 位用于:
          digitalSignature和/或nonRepudiation

  • 可以同时添加两个 EKU,但是没有任何理由这样做,因为我不知道有任何服务器守护程序可以在相同的配置下同时充当客户端和服务器(或反之亦然)。 (2认同)

mat*_*mat 21

任何 CA 证书,无论是根证书还是中间证书,都必须具有keyCertSign扩展名。如果您还想使用 CA 证书签署吊销列表 (CRL)(您通常需要这样做),那么您还必须添加cRLSign。对于 CA 证书,可以并且应该避免任何其他 keyUsages。

openssl 接受的值列表记录在此处

对于最终实体证书,您可以使用 openssl 记录的任何其他 keyUsages,只需确保不包含上述 CA 扩展。从安全的角度来看,您不应该使用更多的 keyUsages(特别是建议使用单独的证书进行签名和加密),但这不是一个严格的要求。

请注意,除了经典的 keyUsages,还有extendedKeyUsage(EKU) 扩展,它不仅限于 RFC 中的预定义值,而且理论上可以容纳您喜欢的任何 OID。已知值例如用于签署时间戳或 OCSP 响应的证书。

您不需要使用nsCertType. 那些,连同所有其他 ns* 扩展,由 Netscape 很久以前定义,不应再使用。您可能找不到任何仍在使用它们的软件。

对于其他扩展,唯一绝对需要的是basicConstraints具有布尔CA标志的扩展,您必须相应地设置该标志。强烈建议使用 authorityKeyIdentifier 和 subjectkeyIdentifier 扩展。

  • openssl 文档确实有一个值列表,但不幸的是,它们的含义的解释绝对为零(因此实际上毫无用处)。 (3认同)