2014-12-23 2 views
0

Особенностью веб-сайта, на котором я работаю, является возможность отправки данных POST на удаленный сервер с использованием сертификата клиента и TLS.Как настроить IIS/Asp.Net для использования сертификата клиента для подключения 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; 
    } 
} 

При отладке приложения локально, я получаю возможность разрешить использование сертификата:

Request for permission

После установки сертификата на сервере мне удалось запустить небольшую тестовую программу за пределами IIS, и она может использовать сертификат без каких-либо подсказок.

Я не могу понять, как получить сайт для использования сертификата при работе в пуле приложений в IIS.

Все, что я нашел до сих пор, касалось добавления привязок, чтобы сертификаты могли использоваться для клиентов, подключающихся к приложению, вместо использования клиентских сертификатов для подключения к другим серверам.

В случае, если это имеет значение, это для IIS7 на сервере 2008 R2.

ответ

0

кажется, что с помощью 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; 
    } 
} 
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; 
     } 
    }