如何将该根证书作为受信任的根导入 Azure 应用服务?

Posted

技术标签:

【中文标题】如何将该根证书作为受信任的根导入 Azure 应用服务?【英文标题】:How to import that root certificate as trusted root in Azure AppService? 【发布时间】:2021-12-17 20:00:09 【问题描述】:

目前我正在做一个项目,我需要验证证书的.cer 版本。对于每笔交易,用户都将上传一个新的.cer 文件。下面是我的代码

       public static bool IsValidCert(this MemoryStream cer)
        
            using X509Certificate2 cert = new X509Certificate2(cer.ToArray());
            return cert.Verify();
        

因此,在本地系统中,证书正在得到正确验证(当前使用自签名证书)。因此,要确保将每个证书添加到下面使用 X509Store 的代码的根目录中

public static bool IsValidCert(this MemoryStream cer)
        

            using X509Certificate2 cert = new X509Certificate2(cer.ToArray());

            using X509Store store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);

            store.Open(OpenFlags.ReadWrite);
            store.Add(cert);
            store.Close();

            return cert.Verify();
        

所以它适用于我的本地系统。但是当我将同一段代码推送到 Azure App service 时,出现以下错误:- "Chain error: UntrustedRoot A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider."

我没有得到的问题在哪里。在我的本地系统中,证书位于受信任的根证书颁发机构中。

如何在 Azure 中将该根证书导入为受信任的根?

用例:- 我正在使用 GraphAPI,并且正在为 AAD 应用程序创建客户端证书。因此用户(已授权)将上传证书以创建 AAD 应用程序。所以我需要在将证书推送到 Graph API 之前验证证书是否有效。目前使用X509Certificate2 来验证证书。所以一个不受信任的证书(自签名证书)在应用服务中阻止了我。

【问题讨论】:

由于您已经开始讨论 MS Q&A,在此处发布链接以帮助其他社区成员:How to import that root certificate as trusted root in Azure AppService? 可以参考Adding trust to root certificate store on an App Service和Root CA on App Service 【参考方案1】:

应用服务前端不对传入的客户端证书进行任何证书验证。

对于应用服务多租户 PaaS,不支持添加/删除机器的受信任证书存储。目前仅 ASE(应用服务环境)支持添加根 CAS。 ASE -private-client-certificate

应用服务是在 Azure PaaS(平台即服务)基础架构之上运行的服务。应用服务在 sandboxed environment 上运行,对底层计算机有限制。

在应用服务中,请求的 TLS 终止发生在前端负载平衡器上。将请求转发到启用了客户端证书的应用代码时,应用服务会使用客户端证书注入 X-ARR-ClientCert 请求标头。除了将其转发到您的应用之外,应用服务不会对此客户端证书执行任何操作。您的应用代码负责验证客户端证书。

另外,请查看samples 和文档here。

【讨论】:

嗨 Ajay,这与 SSL 身份验证无关。更准确地说,我正在使用 GraphAPI 并且正在为 AAD 应用程序创建客户端证书。因此用户(已授权)将上传证书以创建 AAD 应用程序。所以我需要在将证书推送到 Graph API 之前验证证书是否有效。目前使用 X509Certificate2 来验证证书。所以不受信任的证书(自签名证书)在应用服务中阻止了我。 感谢您分享更清晰的信息。在多租户应用服务中,由于沙盒限制,您无法修改可信根存储。但是,您可以在 ASE 上修改受信任的根存储。应用服务有一个受信任根证书列表,您无法在应用服务的多租户变体版本中修改这些证书,但您可以在应用服务环境 (ASE) 中的受信任根存储中加载您自己的 CA 证书,这是一个单一的- 应用服务中的租户环境。因此,如果没有受信任的 CA 签署的 ASE 或证书,您将无法完成您想要完成的工作。 请查看此文档以获取更多详细信息。 azure.github.io/AppService/2021/06/22/… Azure Web App 沙盒 github.com/projectkudu/kudu/wiki/… Azure App Service 上的操作系统功能 docs.microsoft.com/azure/app-service/…【参考方案2】:

目前AppService中似乎没有办法将其添加到root(除了一些默认由MS添加的)可以通过Kudu中的以下命令进行检查。

dir cert:\localmachine\root

所以要处理这种情况,就使用了这种方式。使用X509Chain 时,它将验证所有证书验证以及UntrustedRoot。所以我们需要为这个子案例添加一些额外的验证(例如检查哪些固定域列表)或者需要允许UntrustedRoot 证书。代码看起来像这样

public static bool IsValidCert(this byte[] cer)
     

            using X509Certificate2 cert = new X509Certificate2(cer.ToArray());
            using X509Chain certChain = new X509Chain();
            certChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
            var result = certChain.Build(cert);


            if (!result && certChain.ChainStatus.Any(status => status.Status != X509ChainStatusFlags.UntrustedRoot))
            
                foreach (X509ChainStatus chainStatus in certChain.ChainStatus)
                
                    if (chainStatus.Status == X509ChainStatusFlags.UntrustedRoot)
                    
                      //Custom logic to handle the scenario  
                    
                    else
                    
                      //throw exception for the validation error
                    
                
                throw new exception();
            
            return true;
        

【讨论】:

以上是关于如何将该根证书作为受信任的根导入 Azure 应用服务?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 应用服务上的受信任根证书

Azure App Service 上的根证书

如何在 Java 中获取受信任的根证书列表?

Win软件 - (Net-Framework)已处理证书链,但是在不受信任提供程序信任的根证书中终止

Win软件 - (Net-Framework)已处理证书链,但是在不受信任提供程序信任的根证书中终止

导入证书网站添加信任,vsphere上传文件失败