分类
devops

jwks

JWKS(JSON Web Key Set)是一种用于存储和管理公钥的格式,用于验证JSON Web Token(JWT)。

JWKS是一个JSON对象,包含一个或多个公钥,每个公钥都有一个唯一的标识符。JWKS通常用于以下场景:

  1. 公钥管理:JWKS提供了一种标准化的方式来存储和管理公钥,使得公钥的发布、更新和撤销变得更加容易。
  2. JWT验证:当客户端收到一个JWT时,可以使用JWKS来验证JWT的签名。客户端可以从JWKS中获取公钥,并使用公钥来验证JWT的签名。

一个典型的JWKS对象如下所示:

{
  "keys": [
    {
      "kty": "RSA",
      "n": "0vx7ago...",
      "e": "AQAB",
      "kid": "1234567890",
      "use": "sig"
    },
    {
      "kty": "EC",
      "x": "1234567890...",
      "y": "9876543210...",
      "kid": "9876543210",
      "use": "enc"
    }
  ]
}

在JWKS中,每个公钥都由一个JSON对象表示,包含以下属性:

  • kty:公钥类型(例如RSA、EC等)
  • n:公钥模数(仅适用于RSA)
  • e:公钥指数(仅适用于RSA)
  • xy:公钥坐标(仅适用于EC)
  • kid:公钥标识符
  • use:公钥用途(例如sig表示签名,enc表示加密)

JWKS格式在RFC 7517中定义,是一种广泛使用的标准格式。

生成JWKS(JSON Web Key Set)通常需要使用公钥和私钥对。以下是一个使用OpenSSL生成JWKS的例子:

生成私钥和公钥

首先,我们需要生成一对私钥和公钥。我们可以使用OpenSSL来生成:

openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem

这将生成一个2048位的RSA私钥(private_key.pem)和一个对应的公钥(public_key.pem)。

生成JWKS

接下来,我们需要将公钥转换为JWKS格式。我们可以使用OpenSSL的openssl rsa命令来提取公钥信息:

openssl rsa -pubin -in public_key.pem -outform PEM -noout | jq -R 'split("\n") | .[1] as $n | .[2] as $e | {kty: "RSA", n: $n, e: $e, kid: "1234567890", use: "sig"}'

这将输出一个JWKS对象:

{
  "kty": "RSA",
  "n": "0vx7ago...",
  "e": "AQAB",
  "kid": "1234567890",
  "use": "sig"
}

生成完整的JWKS

如果我们需要生成一个包含多个公钥的JWKS,我们可以重复上述步骤,并将多个公钥添加到一个数组中:

{
  "keys": [
    {
      "kty": "RSA",
      "n": "0vx7ago...",
      "e": "AQAB",
      "kid": "1234567890",
      "use": "sig"
    },
    {
      "kty": "EC",
      "x": "1234567890...",
      "y": "9876543210...",
      "kid": "9876543210",
      "use": "enc"
    }
  ]
}

使用工具生成JWKS

除了使用OpenSSL命令行工具外,还有许多在线工具和编程语言库可以帮助生成JWKS,例如: