如何将该根证书作为受信任的根导入 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 应用服务?的主要内容,如果未能解决你的问题,请参考以下文章
Win软件 - (Net-Framework)已处理证书链,但是在不受信任提供程序信任的根证书中终止