【问题标题】:How do I get the pem from .jks file?如何从 .jks 文件中获取 pem?
【发布时间】:2021-12-30 07:26:51
【问题描述】:

我正在尝试使用 .jks 文件来签署 jwt 令牌。我使用的库是 pyjwt 和 pyjks。下面是sn-ps的代码:

        userDto = user
        payload = {
            "iss": "test",
            "exp": datetime.now(tz=timezone.utc) + timedelta(days=365),
            "iat": datetime.now(tz=timezone.utc),
            "nbf": datetime.now(tz=timezone.utc),
            "sub": "testUser",
            "auth": userDto
        }
        keystorePath = os.path.abspath("KeyStore.jks")
        keystorePass = "test"
        keyAlias = "test"
        keystore = jks.KeyStore.load(keystorePath, keystorePass)
        pk = keystore.private_keys[keyAlias]

        encoded = jwt.encode(payload, pk, algorithm="RS512")

在执行最后一行代码以使用 jks 签名生成 jwt 时,它会抛出错误,提示需要 PEM 格式的密钥。我认为 pk 格式不是 jwk 所需要的。我的问题是如何从 .jks 中提取 pem 文件格式的文件来签署 jwk 令牌?谢谢。

【问题讨论】:

  • 任何帮助将不胜感激。谢谢。

标签: python-3.x pem jks pyjwt pyjks


【解决方案1】:

“PEM”只不过是base64 编码的密钥,包含在-----BEGIN XYZ----- 标题行和-----END XYZ----- 页脚行中,其中XYZ 是密钥类型(例如“PRIVATE KEY”或“CERTIFICATE”)。

来自https://pyjks.readthedocs.io/en/latest/examples.html的示例:

读取 JKS 或 JCEKS 密钥库并将其内容转储到 PEM 格式:

import sys, base64, textwrap
import jks

def print_pem(der_bytes, type):
    print("-----BEGIN %s-----" % type)
    print("\r\n".join(textwrap.wrap(base64.b64encode(der_bytes).decode('ascii'), 64)))
    print("-----END %s-----" % type)

所以在你的情况下,稍微修改以返回一个文本块,而不是打印它:

import sys, base64, textwrap
import jks

def format_pem(der_bytes, type):
    return "\r\n".join([
        "-----BEGIN %s-----" % type,
        "\r\n".join(textwrap.wrap(base64.b64encode(der_bytes).decode('ascii'), 64)),
        "-----END %s-----" % type
    ])

# ...

pk = keystore.private_keys[keyAlias]
pk_pem = format_pem(pk, "PRIVATE KEY")

【讨论】:

  • 嗨,Tomalak,非常感谢您的帮助。我对您的代码进行了一些更改,现在可以使用。我没有直接使用 pk ,而是使用 pk.pkey 将其更改为类似字节的对象。我得到了用 jks 的私钥签名的最终 jwt 令牌。再次感谢您的及时帮助和见解!欣赏!
  • @Felix 是的,您可能已经猜到了,代码没有经过真正的测试。 :) 请随时对我的答案进行必要的更改!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2010-11-02
相关资源
最近更新 更多