簡體   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