繁体   English   中英

如何配置IIS / Asp.Net以将客户端证书用于TLS连接到服务器

[英]How to configure IIS/Asp.Net to use a client Certificate for TLS connection to a server

我正在工作的网站的功能是能够使用客户端证书和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。

尝试扩展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;
      }
  }

似乎使用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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM