在 AWS KMS 服务中创建密钥对后,我可以看到公钥如下所示:
-----BEGIN PUBLIC KEY-----
J1UJQVArKIBiUNUgvkEamuz4treK5qSCJeUD+TcN9lPEQTXrApYV+CcXnuQJql472gPGtTNbyE
-----END PUBLIC KEY-----
但是当客户端调用 jwks 端点 url 时(例如 https://my-authorization-service.com/.well-known/jwks)
我希望响应看起来像任何其他常规(例如 google jwks 等)jwks 响应,如下所示:
{
"alg": "RS256",
"kty": "RSA",
"use": "sig",
"n": "vYjDQCjiQCjiQCjiQCjiQCji",
"e": "AQAB",
"kid": "79adDfP_ggD-fuxsFWdkd",
"x5t": "aaaaaaabbbbbbbbcccccccc",
"x5c": [
"the_x5c_bla_bla"
]
}
此 JWKs 端点的目的是让授权者引用此端点来获取正确的 JWKs 密钥,以便验证/验证已由私钥签名的 JWT 令牌。
如何以上述 JWKs 格式呈现 KMS 公钥?还是我做错了什么?
原来这是将RSA公钥导出为jwk格式的问题。
这个问题在另一篇 stackoverflow 帖子中得到了回答,链接到答案
在 Javascript(NodeJS 运行时)中,您可以本地执行此操作(从 Node 15.9.0 或更高版本开始):
import { createPublicKey } from 'crypto'
const pemPublicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG...
-----END PUBLIC KEY-----`
const publicKey = createPublicKey(pemPublicKey)
console.log(publicKey.export({ format: 'jwk' }))
所以我必须提取 KMS 公钥并导出/转换密钥,如上所示。然后最后根据需要提供密钥,并通过我的 JWKs 端点获取它。