C# Can';t覆盖Azure Web应用中的服务器证书验证 概述

C# Can';t覆盖Azure Web应用中的服务器证书验证 概述,c#,asp.net,azure,ssl,azure-web-app-service,C#,Asp.net,Azure,Ssl,Azure Web App Service,我似乎有表中所列问题的变体。然而,那里的答案并没有真正帮助我,我的情况也不同 我在一家大型公司工作,他们决定将自己视为根证书颁发机构。我开发了一个web应用程序,需要链接到Azure中VM中托管的API 我的方法 由于我无法在受信任的存储中安装证书,所以我尝试通过代码来完成此操作。我使用的是ASP.NET Web API v2,我已将以下代码添加到启动部分: public void Configuration(IAppBuilder app) { Configur

我似乎有表中所列问题的变体。然而,那里的答案并没有真正帮助我,我的情况也不同

我在一家大型公司工作,他们决定将自己视为根证书颁发机构。我开发了一个web应用程序,需要链接到Azure中VM中托管的API

我的方法 由于我无法在受信任的存储中安装证书,所以我尝试通过代码来完成此操作。我使用的是ASP.NET Web API v2,我已将以下代码添加到启动部分:

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        var options = CorsOptions.AllowAll;
        app.UseCors(options);

        // Override certificate check
        ServicePointManager.ServerCertificateValidationCallback =   MyRemoteCertificateValidationCallback;
    }
我的回调如下所示:

public bool MyRemoteCertificateValidationCallback(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
    {
        switch (sslPolicyErrors)
        {
            case SslPolicyErrors.RemoteCertificateChainErrors:                    
                return IsTheCertificateOriginAcceptable(chain);
            case SslPolicyErrors.None:
                return true;
            default:
                return false;
        }
    }
certificate origin acceptable函数正在检查问题是否是由未知根引起的,然后检查未知根是否是代码知道的额外根(因为我无法将受信任根添加到Azure Web应用程序-如果我有VM,安装证书将是一种方法)

如果不是,则抛出一个web异常:

bool IsTheCertificateOriginAcceptable(X509Chain chain)
{
   // checks to see if the initail problem is an untrusted root,
   // and to extract the origin certificate
   if (certificate.IssuerName.Name == expectedIsserName)
   {
       return true;
   }
   else
   {
       throw new WebException($"Certificate origin unacceptable Actual Issue Name '{certificate.IssuerName.Name}', expected issuer name '{expectedIssuerName}'");
   }
计划是从VM中找到发行者名称,然后将其放入代码中-这是探索性代码,以确定如何完成连接

本地运行 然后我用两个网站为自己建立了IIS。一个运行这段代码,另一个运行在不同的端口上,默认的自签名证书运行一个我试图调用的API的普通模拟

当我这样做时,如果我不使用上述代码,我会得到与Azure相同的错误:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
如果我使用代码,我会得到以下消息

Certificate origin unacceptable Actual Issue Name 'CN=localhost', expected issuer name ''
在Azure Web应用程序中 当我将上述代码部署到Azure时,总是会出现证书信任错误,这表明没有调用回调

我无法轻松检查远程服务器的SSL设置,因为它未连接到internet(我已将azure web应用程序连接到虚拟机所在的VNET)


因此,考虑到所有这些,除了建议远程服务器从已知和受信任的RCA获得适当的证书之外,我如何连接呢?

事实证明,框架的行为并不是我所期望的

我的情况是一个自签名根证书,以及该自签名证书的子证书。在这种情况下,我希望有一个证书被标记为
不可信

但是,在这种情况下,框架的行为不允许只提供叶证书,因此链的长度为1。然后该链被分类为
PartialChain

我的逻辑是寻找一个不可信的链接,而不是一个PartialChain,因此尽管调用了回调,我还是在没有得到之前的许可的情况下返回

因此,我的逻辑是错误的——我通过将回调设置为始终返回true来确认这一点。然后,我设置了两个自签名证书,并在localhost上使用了第二个网站——它复制了错误,并允许我查看逻辑错误的位置


感谢那些发表评论的人,我应该检查回调是否设置为true,并在发布之前解决了问题

由于webApp是安全的,很多操作都受到安全性的限制,我不确定它是否可以在Azure webApp上执行。如果可能的话,请尝试将其移动到Azure Visual Machine作为解决方法。我建议尝试按照此方法进行操作,看看设置每个连接是否可能产生影响?我对此有问题。但是在我的例子中,如果根证书不在存储中,则永远不会调用回调。它在你身上做过吗?