创建 JWK 服务器以在 kubernetes 中提供密钥

Creating a JWK server to servex keys in kubernetes

我正在尝试在 pod(在 k8s 上)中创建一个 JWK 服务器,它会在收到对特定孩子的请求时提供密钥。我使用生成函数创建 JWK

func (s *jwkServer) startJWKServer() {
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }
    jwk := go_jose.JSONWebKey{
        Key:                         privateKey,
        KeyID:                       "rand_key_id",
        Algorithm:                   "RSA256",
    }
    s.jwk = &jwk
}

func (s *jwkServer) ServeHTTP(response http.ResponseWriter, request *http.Request) {

    // Do some encoding and decoding to encapsulate into the response object
    return s.jwk
}

我使用上面生成的密钥对 JWT 令牌进行签名。 当请求上述密钥时,pod returns 密钥。

这里的问题是,如果在 JWK 请求进入之前 pod 重新启动,则无法找到密钥,这会导致错误。应该如何处理这种情况?

我在这里考虑了几个解决方案

解决方案 1:每次都创建相同的密钥,但如果有人可以访问该密钥,这将是一个问题。

解决方案 2:每次 pod 重新启动时都会生成一个新的 JWK 密钥,但我担心 pod 多次重新启动的情况会增加代码的延迟。

我应该如何处理 kubernetes 中的 JWK 服务器?

这是我们如何解决的

  1. Public 密钥保存在某处(数据库或 PV 或保管库)

  2. 当请求进来并且pod还没有重启时,我们会在内存中有public键,服务器returns键

  3. 当请求进入并且 pod 重新启动时,我们不会在内存中有 public 键。但是我们仍然会在我们的持久层中拥有它,我们会从持久层提供 public 键。