什麼是 JSON Web Key (JWK)?
JSON Web Key (JWK) 是用於表示加密密鑰的基於 JSON 的格式。它在 JSON Web Signature (JWS) 和 JSON 網路加密 (JSON Web Encryption, JWE) 中廣泛使用,用於驗證 JSON Web Tokens 的完整性和機密性。它也在 OpenID Connect (OIDC) 中用於身份和存取管理 (Access Control)。
例如,一個 PEM 編碼的 ECDSA 公鑰:
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEF/xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4
f1Qx3y49cUm646fMBX9DYx+43HzXm6VdX77uFymz90aO4dBunpTdUzLFRAiT7+In
gzZGDrIE+FG6CcqQuRP65r65SUzDOmP5
-----END PUBLIC KEY-----
可以表示為 JWK:
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
JWK 如何工作?
由於 JWK 是一種基於 JSON 的格式,相較於傳統的 PEM 格式,它可以攜帶更豐富的密鑰元數據。以下是 JWK 中的一些常見屬性:
kty
(Key Type):與密鑰一起使用的加密算法系列。常見值包括RSA
、EC
和oct
。EC
在 RFC 7518 中被標記為 “Recommended+”。use
(Public Key Use):公鑰的預期用途。常見值包括sig
(簽名) 和enc
(加密)。key_ops
(Key Operations):密鑰支持的操作。常見值包括sign
、verify
、encrypt
和decrypt
。alg
(Algorithm):預期與密鑰一起使用的算法。根據密鑰類型,算法可能有所不同。例如,RS256
可能與 RSA 密鑰一起使用,而ES256
可能與 EC 密鑰一起使用。kid
(Key ID):密鑰的唯一標識符。可以用於在一組密鑰中匹配特定密鑰。
除 kty
外,所有其他屬性都是可選的,可以用於提供有關密鑰的額外上下文。根據 kty
的值,其他屬性可能是必需的或可選的。在上述示例中,JWK 表示一個帶有 P-384 曲線的 ECDSA 密鑰 (kty: "EC"
)。x
和 y
屬性包含公鑰坐標。
以下是另一個非規範的 RSA 公鑰 JWK 示例:
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
}
有關 JWK 屬性及其含義的詳細信息,請參閱 RFC 7517 。
JSON Web Key Set (JWKS)
當需要將多個 JWK 組合在一起時,它們會被組織成 JSON Web Key Set (JWKS)。JWKS 是一個 JSON 對象,包含一個 JWK 的數組。它常用於 OpenID Connect (OIDC) 發現 (Discovery) 的 jwks_uri
端點的響應中,以提供 JWT 簽名密鑰 (Signing key) 驗證的公鑰。
以下是包含兩個 JWK 的 JWKS 的非規範示例:
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
},
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
]
}
在此示例中,JWKS 包含兩個 JWK:一個 RSA 密鑰和一個 EC 密鑰。keys
屬性是一個 JWK 的數組,每個都代表不同的密鑰。