Certificate X.509用于验证JWT的扩展

Certificate X.509用于验证JWT的扩展,certificate,jwt,digital-signature,x509,pki,Certificate,Jwt,Digital Signature,X509,Pki,我想创建一个X.509公钥证书来验证签名,尤其是JWT令牌 我想知道在证书上设置哪些属性和扩展属性以限制它进行JWT验证 不幸的是,X.509扩展的规范非常冗长。因此,我也非常感谢您简要介绍可用的X.509扩展、属性及其含义。使用非对称密钥的JWT签名和验证只使用密钥对,而不是证书。只需要一个公钥来验证令牌签名 公钥可以包含在证书中,以便发送给验证方,但实际上并不需要,并且接收者没有义务对X509证书可能具有的任何属性或扩展执行验证。您需要强制执行此类限制的证书扩展类型是。。。密钥使用和/或扩展

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

我想知道在证书上设置哪些属性和扩展属性以限制它进行JWT验证


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

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


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

您需要强制执行此类限制的证书扩展类型是。。。密钥使用和/或扩展密钥使用扩展。对于任何类型的数字签名,您至少需要使用名为数字签名,如中所述。RFC的§4.2.1.3和4.2.1.12规定了标准(扩展)密钥使用扩展

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

  • 您必须提前知道所有可能用于JWT签名的公钥。情况并非总是如此。(例如,在某些情况下,作为验证者,您只想知道密钥属于某个受信任组织的实体,并且该密钥已被允许签名。)
  • 如果公钥列表太大,则很难管理
  • 如果钥匙经常更换(请记住,钥匙应该定期更换),则很难管理
  • 因此,如果这些限制影响到您,X.509证书提供了一个更具可扩展性和灵活性的解决方案,当然还有一层复杂性。对于证书,其工作原理如下:

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

    • 在没有验证的情况下,验证方怎么知道没有中间人的密钥?公钥必须事先在验证方的可信存储库中获得。以这样一种方式,令牌始终使用受信任的公钥进行验证。如何将此公钥或证书发送给验证方超出了JWT规范的范围。是否有任何X.509扩展密钥使用(EKU)扩展可用于限制JWT签名的证书?。此外,您是否知道识别这些签名者的标准方法(如有),例如使用某些特定的DN属性或SAN?不知道JWT(签名)的任何X.509标准EKU。但是使用您自己的自定义EKU是可行的,因为它具有灵活的PKI(例如EJBCA支持自定义EKU)和jwt库。(Microsoft在Windows环境中使用了一系列特定于供应商的EKU。)另一个更“标准”的选项是一个子CA,专门用于颁发JWT签名者证书,而且JWT验证器必须只信任这个子CA。可能有些过火,但更兼容我所期望的JWT库。谢谢@CyrilDangerville,但请注意,这些方法将丢失证书主体标识。现在,即使它不直接应用于验证用于JWT签名的证书,我发现最好的基于标准的近似方法是RFC 8705,“OAuth 2.0相互TLS客户端身份验证和证书绑定访问令牌”,这提到了一些允许在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具有有效的证书(验证过程取决于方法,例如在第一种方法中:检查JWT签名的自定义EKU的存在)。我的意思是,证书验证器通常希望验证主体(例如,通过将其与预期的签名者名称进行匹配,例如,
      CN=Token签名者1
      )在证书中,也要确保他正在接收由预期签名方签名的对象,否则,从同一CA接收类似证书的其他实体可以使用您提到的所有属性生成JWT,并模拟预期签名者。