System.Cryptography.Cng能否在Azure Functions中正常运行?
问题根因
你遇到的PlatformNotSupportedException和Azure Functions Windows环境的沙箱限制直接相关,和.NET Core 3.1的API支持度无关:
- 本地控制台应用运行在当前用户的完整权限上下文,可正常访问Windows CNG加密接口的所有能力
- Windows环境下的Azure Functions(尤其是消费计划、弹性Premium计划)默认运行在App Service沙箱中,沙箱默认禁用了对CNG密钥持久化存储、部分底层加密操作的访问权限,即便官方文档标注
ECDiffieHellmanCng支持.NET Core 3.1,沙箱限制也会导致API调用失败
解决方案
- 优先使用跨平台的
ECDiffieHellman抽象类工厂方法创建实例,不要直接实例化ECDiffieHellmanCng实现类:
.NET Core 3.1在Windows环境下会自动适配Cng实现,同时规避直接调用Cng实现类触发的沙箱权限校验,只要你不需要访问持久化存储的密钥,该写法可以在沙箱中正常运行。// 替换掉 new ECDiffieHellmanCng() 写法 using var ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256); - 如果你必须使用
ECDiffieHellmanCng的专属API,将Functions的托管计划更换为Windows专用App Service计划,开启Always On配置,专用计划的沙箱限制远低于消费计划,可正常调用CNG相关接口。 - 避免在
ECDiffieHellmanCng构造参数中指定需要持久化存储的密钥,尽量使用临时(ephemeral)密钥重载,临时密钥不需要读写系统/用户密钥存储,不会触发沙箱限制。 - 若条件允许,将项目升级到.NET 6及以上版本,更高版本的.NET运行时对Azure Functions沙箱的加密API适配更完善,可避免大量兼容性问题。
内容的提问来源于stack exchange,提问作者Bon Macalindong
相关产品推荐
相关产品推荐

