【问题标题】:Creating a JWK server to servex keys in kubernetes在 kubernetes 中创建一个 JWK 服务器来服务密钥
【发布时间】:2021-10-08 08:36:21
【问题描述】:

我正在尝试在一个 pod(在 k8s 上)中创建一个 JWK 服务器,当一个特定孩子的请求进来时,它将为密钥提供服务。我使用 generate 函数创建 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 令牌。 当对上述 key 的请求进来时,pod 会返回 key。

这里的问题是,如果 pod 在 JWK 的请求到来之前重启,那么 key 就找不到了,这会导致错误。这种情况应该如何处理?

我在这里想到了几个解决方案

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

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

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

【问题讨论】:

  • 您有可以分享的部署文件吗?最好是 pod manifest?
  • 我尝试添加更多代码来解释我在做什么,希望对您有所帮助
  • 您需要将密钥保存在某处;如果有多个副本,或者如果 pod 重新启动,它们都需要就密钥是什么达成一致。一个简单的选择是通过 Secret 注入它,尽管这有一些相当明显的缺点(集群操作员很容易将其提取出来)。

标签: kubernetes jwt jwk


【解决方案1】:

我们是这样解决的

  1. 公钥保存在某处(数据库或 PV 或保险库)

  2. 当请求进来并且pod没有重启时,我们会在内存中保存公钥,服务器返回密钥

  3. 当请求进来并且 pod 已经重新启动时,我们不会在内存中拥有公钥。但我们仍然会将它放在持久层中,我们将从持久层提供公钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2019-03-20
    • 2019-09-16
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多