gpt4 book ai didi

azure - 如何在 Azure WebJob 上签署 JWT token 而不出现 CryptographicException?

转载 作者:行者123 更新时间:2023-12-02 02:18:35 26 4
gpt4 key购买 nike

我有一个 WebJob,需要创建 JWT token 才能与外部服务通信。当我在本地计算机上运行 WebJob 时,以下代码有效:

public static string SignES256(byte[] p8Certificate, object header, object payload)
{
var headerString = JsonConvert.SerializeObject(header);
var payloadString = JsonConvert.SerializeObject(payload);

CngKey key = CngKey.Import(p8Certificate, CngKeyBlobFormat.Pkcs8PrivateBlob);
using (ECDsaCng dsa = new ECDsaCng(key))
{
dsa.HashAlgorithm = CngAlgorithm.Sha256;
var unsignedJwtData = Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(headerString)) + "." + Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(payloadString));
var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
return unsignedJwtData + "." + Base64UrlEncoder.Encode(signature);
}
}

但是,当我将 WebJob 部署到 Azure 时,出现以下异常:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: NotificationFunctions.QueueOperation ---> System.Security.Cryptography.CryptographicException: The system cannot find the file specified. at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format) at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat format, CngProvider provider)

它说找不到指定的文件,但我传入的参数不是在查看文件位置,而是在内存中。根据我收集的信息,我可能需要启用某种加密设置才能使用 CngKey.Import 方法,但我在 Azure 门户中找不到任何与此相关的设置来配置。

我也尝试过使用 JwtSecurityTokenHandler,但它似乎无法处理我需要使用的 ES256 哈希算法(即使它在 JwtAlgorithms 类中被引用为 ECDSA_SHA256)。

如有任何建议,我们将不胜感激!

更新

看来 CngKey.Import 实际上可能试图将证书存储在 Azure 上无法访问的位置。我不需要存储它,因此如果有更好的方法来访问内存中的证书或将其转换为更易于使用的不同类型的证书,那么就可以了。

更新2

此问题可能与 Azure Web Apps IIS 设置未加载上述用户配置文件有关 here 。我通过在 Azure 门户应用程序设置中设置 WEBSITE_LOAD_USER_PROFILE = 1 来启用此功能。我在通过 Azure 中的 WebJob 和 Web 应用程序运行代码时尝试过此更新,但仍然收到相同的错误。

最佳答案

我使用反编译器来了解 CngKey.Import 方法实际上在做什么。看起来它试图将我正在使用的证书插入“Microsoft Software Key Storage Provider”。我实际上并不需要这个,只需要读取证书的值,但看起来不可能。

一旦我意识到证书被插入到机器某处的存储中,我就开始思考,如果你的 Azure Web 应用程序像它一样在共享环境中运行,那么从安全角度来看,这种想法会有多糟糕对于免费和共享层。果然,我的虚拟机位于共享层。将其扩展到基本层解决了这个问题。

关于azure - 如何在 Azure WebJob 上签署 JWT token 而不出现 CryptographicException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43349954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com