Azure App Service Web Job使用X509KeyStorageFlags.EphemeralKeySet报错问询
问题根本原因
- X509KeyStorageFlags.EphemeralKeySet参数的核心作用是指定证书私钥仅保存在进程内存中,不会写入Windows CSP(加密服务提供程序)对应的磁盘密钥存储容器。
- .NET Framework 4.7.2 内置的System.Net HTTP栈存在限制:进行基于客户端证书的TLS握手时,必须从磁盘持久化的密钥容器中读取私钥,不支持直接访问内存中临时存储的私钥。你添加EphemeralKeySet参数后,WS调用底层的TLS握手逻辑无法获取到有效私钥,因此抛出
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.异常。 - 去掉该参数后,私钥会按照你指定的
X509KeyStorageFlags.MachineKeySet/UserKeySet参数写入对应磁盘密钥容器,System.Net栈可以正常读取私钥完成TLS握手,因此调用可以正常运行。
关于磁盘空间不足问题的说明
你之前遇到的App Service磁盘占满问题确实和该逻辑有关:如果没有指定EphemeralKeySet,每次实例化X509Certificate2对象都会生成新的临时密钥文件写入磁盘,默认不会自动清理,高频实例化的场景下会快速占用存储空间。
兼容方案
在.NET Framework 4.7.2环境下可以采用以下方式平衡两个问题:
- 用
using语句包裹X509Certificate2实例的生命周期,使用完成后自动调用Dispose方法释放密钥资源,减少残留临时文件。 - 定期清理App Service本地路径
%LOCALAPPDATA%\Microsoft\Crypto\RSA下的过期临时密钥文件,避免磁盘占用持续上涨。 - 条件允许的话可以升级应用到.NET Core 3.0及以上版本,新版HTTP栈已经支持内存临时私钥的TLS握手,此时可以正常使用EphemeralKeySet参数避免写入磁盘。
内容的提问来源于stack exchange,提问作者user16735407
相关产品推荐
相关产品推荐

