10

我正在使用公共根权限证书文件 X509 进行 httpwebrequest。我只有公钥,没有私钥。在控制台应用程序中一切正常,但在 asp.net 应用程序中无法正常工作。我收到错误消息:“底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。”

禁用验证的选项不是一个选项。

这是代码

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://xxxxxxx/gateway.aspx");
string post = "abcdef";
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
req.ContentLength = post.Length;

var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(@"c:\temp\root.cer");

req.ClientCertificates.Add(cert);
StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(post.ToString());
stOut.Close();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

这是来自 System.Net 和 System.Net 套接字的系统日志。

System.Net 信息:0:[5928] SecureChannel#8106798 - 无法将证书链构建到受信任的根颁发机构。

System.Net 信息:0:[5928] SecureChannel#8106798 - 远程证书已被用户验证为无效。

System.Net.Sockets 详细:0:[5928] Socket#7486778::Dispose()

System.Net 错误:0:[5928] HttpWebRequest#51319244 中的异常:: - 基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。

System.Net 错误:0:[5928] HttpWebRequest#51319244::EndGetRequestStream 中的异常 - 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。

更多信息

如果我使用此代码(来自 CodeGuru)

  public static bool ValidateServerCertificate(object sender,
     X509Certificate certificate, X509Chain chain,
     SslPolicyErrors sslPolicyErrors)
  {
     if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateChainErrors) {
        return false;
     } else if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateNameMismatch) {
        System.Security.Policy.Zone z =
           System.Security.Policy.Zone.CreateFromUrl
           (((HttpWebRequest)sender).RequestUri.ToString());
        if (z.SecurityZone ==
           System.Security.SecurityZone.Intranet ||
           z.SecurityZone ==
           System.Security.SecurityZone.MyComputer) {
           return true;
        }
        return false;
     }
     return true;
  }

我最终得到错误:

远程证书链错误

4

2 回答 2

13

这个问题可以通过添加到 Application_Start 来解决:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

它基本上允许服务器与其证书之间的不匹配。

资源:

http://www.ben-morris.com/asp-net-web-services-and-ssl-certificates-establishing-a-trust-relationship

注意:不建议将此解决方法用于生产

于 2012-03-15T22:25:18.450 回答
1

听起来问题可能出在此链接上。ASPNET 工作进程要求证书名称与服务器名称相匹配。有一些变通方法可以在测试环境中实现。

对于证书生成,您可以使用名为 SelfSSL.exe 的免费程序,其命令如下:

SelfSSL.exe /T /N:CN=localhost /V:999 /Q (其中“localhost”是证书名称)

和:

winHTTPCertCfg.exe -g -c local_machine\my -s localhost -a Administrators(授予管理员访问证书的权限)

于 2010-01-07T17:29:07.460 回答