it-roy-ru.com

Request.HttpContext.Connection.ClientCertificate всегда нулевой

У меня есть основной веб-сайт ASP.Net, развернутый в службе приложений Azure для Linux. 

В контроллере я пытаюсь получить сертификат клиента, как показано ниже:

var callerCertificate = Request.HttpContext.Connection.ClientCertificate;

Я всегда получаю callerCertificate как null. Я пробовал await Request.HttpContext.Connection.GetClientCertificateAsync() с тем же результатом null.

Создание моего веб-сайта выглядит так:

WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseStartup<Startup>()
                .UseSerilog();

Я также установил настройки SSL для веб-сайта (в Azure), как показано ниже:

 enter image description here

Вызывающая сторона на стороне клиента - это проект net462, который использует Microsoft.Rest.CertificateCredentials для установки сертификата на HTTP-запрос.

var cred = new CertificateCredentials(_deviceCertificate)
...
await this.cred.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
4
Tany

Вы можете попытаться добавить сертификат, используя HttpClient напрямую, а не Microsoft.Rest.CertificateCredential.

var clientHandler = new HttpClientHandler();
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(_deviceCertificate);

var client = new HttpClient(clientHandler);
var result = client.GetAsync("https://yourservice").GetAwaiter().GetResult();

Вам также может понадобиться настроить протокол SSL (SSL2, SSL3, TLS и т.д.):

clientHandler.SslProtocols = SslProtocols.Tls;
1
Isma

Отвечая на мой собственный вопрос: Я могу получить сертификат клиента из заголовка

string clientCertFromHeader = Request.Headers ["X-ARR-ClientCert"];

Однако до сих пор остается загадкой, почему Request.HttpContext.Connection.ClientCertificate не предоставляет сертификат. 

0
Tany