You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core应用部署Azure App Service遇CryptographicException文件未找到问题

解决方案

1. 调整证书下载的KeyStorageFlags

Azure App Service的沙箱环境对证书存储权限有限制,默认的X509KeyStorageFlags可能导致无法访问私钥文件。修改证书下载逻辑,指定兼容的存储标志:

var downloadOptions = new DownloadCertificateOptions("<encryption certificate name>")
{
    KeyStorageFlags = X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable
};
var encryptionCertificate = client.DownloadCertificate(downloadOptions).Value;

var signingDownloadOptions = new DownloadCertificateOptions("<signing certificate name>")
{
    KeyStorageFlags = X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable
};
var signingCertificate = client.DownloadCertificate(signingDownloadOptions).Value;

UserKeySet将证书私钥存储到当前用户容器(适配App Service共享环境),PersistKeySet确保私钥持久化,Exportable满足OpenIddict对私钥操作的需求。

2. 避免启动阶段同步下载证书

当前代码在服务配置阶段直接同步调用证书下载,此时Azure凭证初始化可能未完成、环境权限不足。改为通过依赖注入延迟加载证书:

// 提前注册CertificateClient为单例
services.AddSingleton(new CertificateClient(new Uri("<vaultUri>"), new DefaultAzureCredential()));

services.AddOpenIddict()
    .AddServer(options =>
    {
        // 延迟加载签名证书
        options.AddSigningCredential(sp =>
        {
            var client = sp.GetRequiredService<CertificateClient>();
            var options = new DownloadCertificateOptions("<signing certificate name>")
            {
                KeyStorageFlags = X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet
            };
            return Task.FromResult(client.DownloadCertificate(options).Value);
        });

        // 延迟加载加密证书
        options.AddEncryptionCredential(sp =>
        {
            var client = sp.GetRequiredService<CertificateClient>();
            var options = new DownloadCertificateOptions("<encryption certificate name>")
            {
                KeyStorageFlags = X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet
            };
            return Task.FromResult(client.DownloadCertificate(options).Value);
        });
    });

证书会在第一次实际需要时才下载,规避启动阶段的权限或初始化问题。

3. 验证App Service托管标识权限

确保App Service的托管标识(系统/用户分配)拥有Key Vault的以下权限:

  • 证书权限:Certificate Get
  • 机密权限:Secret Get(证书私钥以机密形式存储在Key Vault)
  • 密钥权限:Key Get(若证书包含密钥对)

可在Key Vault的「访问策略」中添加App Service标识并分配上述权限。

4. 改用OpenIddict内置Key Vault支持

OpenIddict支持直接从Key Vault加载凭证,自动适配Azure环境:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.AddSigningCredential(new Uri("<Key Vault签名证书完整URI>"), new DefaultAzureCredential());
        options.AddEncryptionCredential(new Uri("<Key Vault加密证书完整URI>"), new DefaultAzureCredential());
    });

此方式由OpenIddict处理证书加载和环境兼容,无需手动下载证书。

内容的提问来源于stack exchange,提问作者Ali Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:26:14