【问题标题】:How to configure IIS/Asp.Net to use a client Certificate for TLS connection to a server如何配置 IIS/Asp.Net 以使用客户端证书进行 TLS 连接到服务器
【发布时间】:2014-12-23 15:46:40
【问题描述】:

我正在开发的网站的一项功能是能够使用客户端证书和 TLS 将数据发布到远程服务器。

我已获得 p12 客户端证书,并将其安装/添加到系统中。证书在代码中的使用如下,(但似乎也只有安装到系统才能工作):

using (var client = new CertificateWebClient("~/ccert.p12"))
{
   client.UploadFile(endpoint, filepath);
}

public class CertificateWebClient : WebClient
{
    private readonly string _certificateUri;

    public CertificateWebClient(string certificateUri)
    {
        _certificateUri = certificateUri;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        var clientCertificate = new X509Certificate(HostingEnvironment.MapPath(_certificateUri));
        request.ClientCertificates.Add(clientCertificate);
        return request;
    }
}

在本地调试应用程序时,我可以选择允许使用证书:

在服务器上安装证书后,我设法在IIS之外运行了一个小测试程序,它可以在没有任何提示的情况下使用证书。

当在 IIS 的应用程序池下运行时,我不知道如何让网站使用证书。

到目前为止,我发现的一切都是关于添加绑定,以便证书可用于连接到应用程序的客户端,而不是使用客户端证书连接到其他服务器。

如果有任何区别,这是针对 Server 2008 R2 上的 IIS7。

【问题讨论】:

    标签: c# asp.net ssl iis-7 windows-server-2008-r2


    【解决方案1】:

    尝试扩展WebClient并将证书添加到WebRequest,如下所示:

       class MyWebClient : WebClient
       {
          protected override WebRequest GetWebRequest(Uri address)
          {
              HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
              request.ClientCertificates.Add(new X509Certificate("~/ccert.p12", "password_if_any_or_empty"));
              return request;
          }
      }
    

    【讨论】:

      【解决方案2】:

      似乎使用X509Certificate2 而不是X509Certificate 无需身份验证即可工作 - 我认为身份验证是由于证书是从证书存储区加载的,而不是从本地路径加载的。

      下面的类将允许 Asp.Net 站点通过文件路径使用自签名客户端证书。

      public class CertificateWebClient : WebClient
      {
          private readonly string _certificateUri;
      
          public CertificateWebClient(string certificateUri)
          {
              _certificateUri = certificateUri;
          }
      
          protected override WebRequest GetWebRequest(Uri address)
          {
              HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
              ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
              var clientCertificate = new X509Certificate2(HostingEnvironment.MapPath(_certificateUri), "", X509KeyStorageFlags.MachineKeySet);
              request.ClientCertificates.Add(clientCertificate);
              return request;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 2017-03-06
        相关资源
        最近更新 更多