C# 在Azure应用程序服务上提交具有客户端证书的SSL HttpWebRequests

C# 在Azure应用程序服务上提交具有客户端证书的SSL HttpWebRequests,c#,azure-web-app-service,C#,Azure Web App Service,我正在尝试使用.NET的Azure Web应用程序(应用程序服务)中的客户端证书执行一个非常简单的HTTP/SSL请求。对于上下文,它是将日志写入Elasticsearch集群 对System.Net和System.Net.Sockets启用跟踪表明,在尝试加载已加载到内存中的客户端证书的私钥时,请求失败 搜索AcquireCredentialsHandle()失败,错误为0X8009030D表明这显然与证书存储中的权限有关,我没有使用该权限 我的猜测是,出于某种原因,AcquireCreden

我正在尝试使用.NET的Azure Web应用程序(应用程序服务)中的客户端证书执行一个非常简单的HTTP/SSL请求。对于上下文,它是将日志写入Elasticsearch集群

System.Net
System.Net.Sockets
启用跟踪表明,在尝试加载已加载到内存中的客户端证书的私钥时,请求失败

搜索
AcquireCredentialsHandle()失败,错误为0X8009030D
表明这显然与证书存储中的权限有关,我没有使用该权限

我的猜测是,出于某种原因,
AcquireCredentialsHandle
试图访问证书存储,但由于Azure Web应用程序的沙盒环境,它无法访问证书存储

这显然不是IIS特有的问题,因为它在常规可执行文件中也会失败。以下代码在简单的webjob中失败

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace IFHM
{
    class Program
    {
        static void Main(string[] args)
        {
            Environment.CurrentDirectory = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));

            var req = (HttpWebRequest) WebRequest.Create("https://myapp.com");
            req.Method = "GET";
            req.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;
            req.ClientCertificates.Add(new X509Certificate2("client.pfx"));
            try
            {
                var resp = req.GetResponse();
                var respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();
                Console.WriteLine(respStr);
            }
            catch (WebException e)
            {
                Console.Error.WriteLine(e);
                var errRespStr = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                Console.WriteLine(errRespStr);
            }
            
        }
    }
}

似乎您需要将.pfx文件上载到Azure WebApp,并首先使应用程序代码可以访问该文件。您可以使用网站\u加载\u证书应用程序设置来完成此操作


您可以从

获得详细步骤和演示代码,谢谢。显然,仅仅设置
网站\u加载\u证书
就足以允许从磁盘加载证书。这简直让我发疯!!!!!最重要的是,只需要在门户中进行愚蠢的配置更改。叹气。如果您正在手动加载证书(通过文件系统或从数据库读取数据),则需要设置
网站\u加载\u用户\u配置文件
--from。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace IFHM
{
    class Program
    {
        static void Main(string[] args)
        {
            Environment.CurrentDirectory = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));

            var req = (HttpWebRequest) WebRequest.Create("https://myapp.com");
            req.Method = "GET";
            req.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;
            req.ClientCertificates.Add(new X509Certificate2("client.pfx"));
            try
            {
                var resp = req.GetResponse();
                var respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();
                Console.WriteLine(respStr);
            }
            catch (WebException e)
            {
                Console.Error.WriteLine(e);
                var errRespStr = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                Console.WriteLine(errRespStr);
            }
            
        }
    }
}