【问题标题】:Adding .pfx certificate to HttpWebRequest fails from Web application从 Web 应用程序向 HttpWebRequest 添加 .pfx 证书失败
【发布时间】:2017-05-24 12:36:40
【问题描述】:

我创建了一个 Asp.net Web 应用程序-C#,我需要在其中发送一个带有 .pfx 证书的 HttpWebRequest。

我已将证书安装到个人证书文件夹(为用户 NETWORK SERVICE 添加了权限),并且能够在 X509Certificate2Collection 中看到它,并且在将证书添加到 HttpWebRequest 时没有问题。

但是在获取响应(HttpWebResponse)req.GetResponse()时会抛出无法连接到服务器的错误

我只在 Web 应用程序中遇到这个问题,当我尝试使用 C# 控制台应用程序时,相同的代码工作正常(得到正确的响应)。

            X509Store oLocalMachineStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            X509Certificate2Collection oCertColl;
            X509Certificate oCert = new X509Certificate();
            oLocalMachineStore.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);
            oCertColl = oLocalMachineStore.Certificates.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindByIssuerName, "mycertificate issuer", false);
            oLocalMachineStore.Close();
            foreach (X509Certificate oCertFromStore in oCertColl)
            {
                if (oCertFromStore.Issuer.Contains("mycertificate issuer"))
                {
                    oCert = oCertFromStore;
                    oCert.Import(@"certlocation\mycertificate.pfx", "pwd", X509KeyStorageFlags.MachineKeySet);
                    break;
                }
            }

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("destination URL");
            req.ClientCertificates.Add(oCert);

            req.UserAgent = "LOL API Client";
            req.Accept = "application/json";
            req.Method = WebRequestMethods.Http.Get;

            string result = null;
            using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
            {
                StreamReader reader = new StreamReader(resp.GetResponseStream());
                result = reader.ReadToEnd();
            }

【问题讨论】:

  • 你在Fiddler看到了什么?
  • 我已将应用程序池标识更改为 NetworkService 并添加了对 NetworkService 证书的完全控制。
  • 为什么要在循环中重新导入?导入一次并始终使用它们?
  • 我找不到与我尝试过的路径相关的任何请求。
  • 为什么要在循环中重新导入?导入一次并始终使用它们?-我也尝试过这种方式。但结果是一样的。我想知道代码如何在控制台应用程序中工作,而在 Web 应用程序中失败..!!!

标签: c# asp.net ssl


【解决方案1】:

将代理添加到 http 请求后问题得到解决。

req.Proxy = New Net.WebProxy("ProxyURL", False);

但我仍然不知道,当我尝试使用控制台应用程序中的相同代码而不添加代理时它是如何工作的。

如果有人对此有任何想法,请分享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多