【问题标题】:X.509 extensions for verifying JWT用于验证 JWT 的 X.509 扩展
【发布时间】:2019-02-22 11:05:48
【问题描述】:

我想创建一个 X.509 公钥证书来验证签名,尤其是。 JWT 代币。

我想知道要将哪些属性和扩展属性设置为证书上的哪些值以限制 JWT 验证。

不幸的是,X.509 扩展的规范非常冗长。因此,我也非常感谢对可用 X.509 扩展、属性及其含义的简要概述。

【问题讨论】:

    标签: certificate jwt digital-signature x509 pki


    【解决方案1】:

    您需要强制执行此类限制的证书扩展类型是... Key Usage 和/或 Extended Key Usage 扩展。对于任何类型的数字签名,您至少需要名为... digitalSignatureKey Usage,如RFC 5280 中所指定。标准(扩展)密钥用法扩展均在 RFC 的第 4.2.1.3 和 4.2.1.12 节中指定

    为了简单起见,您始终可以避免使用证书,方法是在 JWT 验证者端维护公钥(或指纹,如果您想优化内存/磁盘使用)的信任库(静态列表)。但这有一些限制,例如:

    1. 您必须提前知道所有可能用于 JWT 签名的公钥。这并非总是如此。 (例如,在某些情况下,作为验证者,您只想知道密钥属于某个受信任组织的实体并且已被允许签名。)
    2. 如果公钥列表太大太大,则很难管理。
    3. 如果密钥更改过于频繁(请记住密钥应定期更新),则很难管理。

    因此,如果这些限制影响到您,X.509 证书提供了一个更具可扩展性和灵活性的解决方案,但当然也增加了一层复杂性。有了证书,它的工作方式如下:

    • 每个 JWT 颁发者都有一个由一个或多个证书颁发机构 (CA) 颁发的证书
    • JWT 验证者应该信任这些 CA(受信任的 CA 列表),而不是专门信任每个 JWT 颁发者的证书。
    • JWT 根据RFC 7515(X.509 证书链)在 JWS 标头的 x5c 标头参数中包含签名者的证书(或证书链,如果您使用子 CA),以便验证者可以将证书(链)链接到受信任的 CA 之一。

    【讨论】:

    • 是否有任何可用于限制 JWT 签名证书的 X.509 扩展密钥使用 (EKU) 扩展?此外,您是否知道识别这些签名者的标准方法(如果有),例如通过使用某些特定的 DN 属性或 SAN?。
    • 不知道任何特定于 JWT(签名)的 X.509 标准 EKU。但是通过灵活的 PKI(例如 EJBCA 支持自定义 EKU)和 jwt 库,使用您自己的自定义 EKU 是可行的。 (微软在 Windows 环境中使用了一堆特定于供应商的 EKU。)其他更“标准”的选项是专门用于颁发 JWT 签名者证书的子 CA,而且 JWT 验证者必须只信任这个子 CA。也许矫枉过正,但与我期望的 jwt 库更兼容。
    • 感谢@CyrilDangerville,但请注意,这些方法将缺少证书主题标识。现在,即使它不直接适用于验证用于 JWT 签名的证书,我发现的基于标准的最佳近似值是 RFC 8705,“OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens”,其中提到一些字段为允许在 OAuth 客户端身份验证的上下文中识别证书主题:tls_client_auth_subject_dn、tls_client_auth_san_dns、tls_client_auth_san_uri、tls_client_auth_san_ip、tls_client_auth_san_email。
    • 当您说证书主题将丢失时,我不确定我是否遵循。澄清一下,为了使这些方法起作用,每个 JWT 必须在 JWT 签名中包含一个“x5c”JWS 标头,其中签名者的 X.509 证书作为值(主题和所有内容,可能还有中间 CA 到受信任 CA 的证书) .另一端的验证者应要求 x5c 存在有效证书(验证过程取决于方法,例如在第一种方法中:检查是否存在自定义 EKU 以进行 JWT 签名)。
    • 我的意思是证书验证者通常也想验证证书中的主题(例如,通过将其与预期的签名者姓名相匹配,例如CN=Token Signer 1),以确保他正在接收签名的对象由预期签名的一方,否则,从同一 CA 接收类似证书的其他实体可以生成具有您提到的所有属性的 JWT 并冒充预期的签名者。
    【解决方案2】:

    使用非对称密钥的 JWT 签名和验证仅使用密钥对而不是证书来完成。只需要一个公钥来验证令牌签名。

    公钥可以包含在证书中以便发送给验证方,但这并不是真正需要的,并且接收方没有义务对 X509 证书的任何属性或扩展执行验证可能有。

    【讨论】:

    • 验证方怎么知道,它不是从中间没有证书的人那里得到钥匙的?
    • 公钥必须事先在验证方的信任库中可用。以这样一种方式,令牌始终使用受信任的公钥进行验证。如何将此公钥或证书发送给验证方超出了 JWT 规范的范围
    猜你喜欢
    • 2016-06-14
    • 2022-12-11
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多