2.7. 处理密钥
您可以使用 smallrye.jwt.sign.key.location 和 smallrye.jwt.encrypt.key.location 属性来指定签名和加密密钥的位置。这些密钥可以位于本地文件系统上,位于 classpath 上,或者从远程端点获取。密钥可以是 PEM 或 JSON Web 密钥(JWK) 格式。例如:
smallrye.jwt.sign.key.location=privateKey.pem smallrye.jwt.encrypt.key.location=publicKey.pem
smallrye.jwt.sign.key.location=privateKey.pem
smallrye.jwt.encrypt.key.location=publicKey.pem
或者,您可以使用 MicroProfile ConfigSource 和 smallrye.jwt.sign.key 和 smallrye.jwt.encrypt.key 属性从外部服务获取密钥,如 HashiCorp Vault 或其他 secret 管理器:
smallrye.jwt.sign.key=${private.key.from.vault}
smallrye.jwt.encrypt.key=${public.key.from.vault}
smallrye.jwt.sign.key=${private.key.from.vault}
smallrye.jwt.encrypt.key=${public.key.from.vault}
在本例中,private.key.from.vault 和 public.key.from.vault 是 PEM 或 JWK 格式的密钥值,由自定义 ConfigSource 提供。
smallrye.jwt.sign.key 和 smallrye.jwt.encrypt.key 属性也可以直接包含 base64 编码的私钥或公钥值。
但请注意,不建议在配置中直接显示私钥。仅在需要从远程 secret manager 获取签名密钥值时,才使用 smallrye.jwt.sign.key 属性。
密钥也可以由构建令牌的代码加载,然后提供给 JWT Build API 以进行令牌创建。
如果您需要使用对称 secret 密钥签名或加密令牌,请考虑使用 io.smallrye.jwt.util.KeyUtils 生成所需长度的 SecretKey。
例如,需要使用 HS512 算法(512/8)为令牌签名 64 字节密钥,需要使用 A256KW 算法加密内容加密密钥(256/8):
您还可以考虑使用 JSON Web 密钥(JWK)或 JSON Web 密钥集(JWK Set)格式将 secret 密钥存储在安全文件系统中。您可以使用 smallrye.jwt.sign.key.location 或 smallrye.jwt.encrypt.key.location 属性来引用密钥。
JWK 示例
{
"kty":"oct",
"kid":"secretKey",
"k":"Fdh9u8rINxfivbrianbbVT1u232VQBZYKx1HGAGPt2I"
}
{
"kty":"oct",
"kid":"secretKey",
"k":"Fdh9u8rINxfivbrianbbVT1u232VQBZYKx1HGAGPt2I"
}
JWK 设置示例
您还可以使用 io.smallrye.jwt.util.KeyUtils 生成一对非对称 RSA 或 EC 密钥。这些密钥可以存储 JWK、JWK Set 或 PEM 格式。