簡體   English   中英

生成 JWT 令牌錯誤的 Azure 函數對存儲在密鑰庫機密中的私鑰進行消毒

[英]Azure Function to generate JWT token error desterilising private key stored in key vault secret

我正在構建一個 Azure 函數來為我生成(和重新生成)一個 JWT 令牌,然后我將使用它來調用 DocuSign API。

我在本地工作,並且在調用 DocuSign API 時生成的令牌正在工作。 將其部署到 Azure 函數時遇到了問題。

在本地,我使用本地設置來存儲密鑰,然后將其作為環境變量引用。 在 Azure 上,我使用 Azure Key Vault 將相同的密鑰存儲為機密。 但我對密鑰及其存儲方式有疑問。

在 Azure 函數上運行相同的代碼時出現此錯誤:

Failure Exception: ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).

我相信這是 Azure Key Vault 存儲數據的字符集問題,但即使將其從 UTF-8 編碼為 ANSI 或 ANSI 編碼為 UTF-8,我也無法解決此問題。

import logging
import os
import azure.functions as func
import jwt

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    private_key = os.environ["servicePrivateKey"]

    payload = {"sub": "1234567890","name": "John Doe","iat": 1516239022}

    encoded = jwt.encode(payload, private_key, algorithm="RS256")

    return func.HttpResponse(
        encoded, status_code=200
    )

按照這里的用法示例pyjwt 示例

我的密鑰在本地存儲如下:

"servicePrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAK................m1T6yWn5MparGHIY=\n-----END RSA PRIVATE KEY-----"

在 Azure Key Vault 上,我嘗試以幾種不同的方式將其保存在機密中,但這里是其中的一個示例(這是從 Azure 上的機密值中復制出來的):

-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAK................m1T6yWn5MparGHIY= -----END RSA PRIVATE KEY-----

我現在碰壁了,因為如果不將私鑰以明文形式存儲在 azure 函數中或以某種方式與應用程序文件一起上傳,我無法弄清楚我能做什么。

我最終找到了這個問題的答案。 我解決錯誤的方法是將 txt 文件中的密鑰作為 ascii 編碼的秘密上傳。

Azure 文檔: https ://docs.microsoft.com/en-us/cli/azure/keyvault/secret?view=azure-cli-latest#az-keyvault-secret-set

az keyvault secret set --name
                       --vault-name
                       [--description]
                       [--disabled {false, true}]
                       [--encoding {ascii, base64, hex, utf-16be, utf-16le, utf-8}]
                       [--expires]
                       [--file]
                       [--not-before]
                       [--tags]
                       [--value]

然后,當我閱讀秘密時,它在秘密中添加了 \n (換行符)字符。 但這實際上被讀取為字符串而不是新行。 我只是用換行符替換了字符串版本,這很有效。

private_key = private_key.replace('\\n' , '\n')

所以最終的解決方案是這樣的:

from dataclasses import replace
import logging
import os
import azure.functions as func
import jwt

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    private_key = os.environ["servicePrivateKey"]

    private_key = private_key.replace('\\n' , '\n')

    payload = {"sub": "1234567890","name": "John Doe","iat": 1516239022}

    encoded = jwt.encode(payload, private_key, algorithm="RS256")

    return func.HttpResponse(
        encoded, status_code=200
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM