使用 X.509 向 Web 服务进行身份验证时出现"Could not create SSL/TLS secure channel"错误



我已经看到了几个具有相同错误的线程,并尝试了各种潜在的解决方案,但到目前为止没有运气。我正在使用客户端的休息端点,该端点需要客户证书进行身份验证。我有证书,并通过双击.pfx并完成向导,为当前用户和本地计算机安装了证书。我还使用winhttpcertcfg运行以下内容,以便应用程序池身份帐户(Network Service(可以使用证书:

winhttpcertcfg -i "<path to .pfx> -c LOCAL_MACHINEMy -a "Network Service" -p "<password for .pfx> 

我已将证书插入到MMC并添加了证书,因此当我击中Chrome中的API端点URL时,显示了证书,然后单击它,然后看到XML返回。

不幸的是,我正在使用的代码在尝试获取响应时遇到错误。我的代码(在MVC操作中(:

        var url = "https://obfuscated.api.endpoint.host/api/Profile";
        var certPath = @"C:UserspaldrichAdvisorDirectoryClient.pfx";
        var xmlResult = string.Empty;
        try
        {
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 
                | SecurityProtocolType.Tls12;
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.ContentType = "application/xml;charset=UTF8";
            X509Certificate cert = new X509Certificate(certPath, "obfuscated-password");
            request.ClientCertificates.Add(cert);
            request.PreAuthenticate = true;
            var response = request.GetResponse();
            var responseStream = response.GetResponseStream();
            xmlResult = new StreamReader(responseStream).ReadToEnd();
        }
        catch (Exception ex)
        {
            Log.Error("Bio App web service call failed.", ex, "AdvisorController");
            xmlResult = ex.Message;
        }
        return Json(xmlResult, JsonRequestBehavior.AllowGet);

尝试获得响应时(response.GetResponse()(,我会看到以下错误:The request was aborted: Could not create SSL/TLS secure channel.

我尝试过的事情:

  • 根据C:Userspaldrich授予我证书的Network Service的完全访问权限。
  • 使ServicePointManager.SecurityProtocolSecurityProtocolType.Tls12,也只有SecurityProtocolType.Ssl3
  • 在当前用户和本地计算机的证书导入向导中检查"将此密钥标记为导出"。
  • 验证我的Use Tls 1.0Use Tls 1.1Use Tls 1.2都在Internet Properties中进行了检查。

我意识到提交此问题后我的问题是什么。我需要使用X509Certificate2而不是X509Certificate(我只是尝试2来解决了这一点(,尽管我不明白为什么,除了X509Certificate2是新的事实之外。无论如何,XML即将出现。它显示为一个Unicode转换字符串,但总体而言,目标已经实现。

所以,而不是:

X509Certificate cert = new X509Certificate(certPath, "obfuscated-password");

我必须使用:

X509Certificate2 cert = new X509Certificate2(certPath, "obfuscated-password");

相关内容

  • 没有找到相关文章

最新更新