Проверка подлинности сертификата rest api в Azure с помощью https
У меня проблемы с настройкой службы веб-API asp.net для аутентификации запросов по клиентским сертификатам
Я делаю шаги, описанные в Pro ASP.NET Web Api Security:
- Я создаю сертификаты, используя makecert.exe
makecert.exe -r -n "CN=MobileTradeDataGateway" -pe -sv MobileTradeDataGateway.pvk -a sha256 -cy authority MobileTradeDataGateway.cer
а такжеmakecert.exe -iv MobileTradeDataGateway.pvk -ic MobileTradeDataGateway.cer -n "CN=DataGateway1" -pe -sv DataGateway1.pvk -a sha256 -sky exchange DataGateway1.cer -eku 1.3.6.1.5.5.7.3.2
- Я устанавливаю сертификат MobileTradeDataGateway в сервер доверенных корневых центров сертификации и в клиент тоже. Установите DataGateway1 в личном кабинете клиента.
- Настройте сайт для принятия сертификатов и включения. Включить анонимную аутентификацию.
- Создайте DelegatingHandler и добавьте его в коллекцию обработчиков сообщений в mvc для проверки сертификатов.
Вызовите метод веб-API
var certStore = new X509Store(StoreLocation.CurrentUser); certStore.Open(OpenFlags.ReadOnly); var collection = certStore.Certificates.Find(X509FindType.FindByIssuerName, "MobileTradeDataGateway", true); var cert = collection[0]; certStore.Close(); var messageHandler = new WebRequestHandler(); messageHandler.ClientCertificates.Add(серт); var client = new HttpClient(messageHandler) { BaseAddress = new Uri("...") }; var res = client.GetAsync("/api/orderuploader?number=5"). Результат;
,
Все отлично работает на моей локальной машине и в сети, где моя машина является сервером. Но когда я внедряю его в облачный сервис Azure, я получаю нольvar cert = request.GetClientCertificate(); // here is null
в моем собственном обработчике делегирования
Конечно, я позволяю IIS принимать сертификаты и правильно помещать сертификаты в доверенные корневые центры сертификации.
Есть идеи?
3 ответа
Я думаю, что вы пропустили загрузку сертификата на портал Azure. Убедитесь, что вы загрузили сертификат.cer или.pfx на портал Azure. Дайте мне знать, если вам нужна помощь по загрузке и т. Д.
Вот код моего делегирующего обработчика из веб-интерфейса
public class X509ClientCertificateHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
WebApiEventSource.Log.InvalidHttpsScheme();
return request.CreateResponse(HttpStatusCode.Forbidden);
}
var cert = request.GetClientCertificate(); // here is null!!!
if (cert == null)
{
WebApiEventSource.Log.FailureAuthenticate("certificate is abcent", "", "");
return request.CreateResponse(HttpStatusCode.Unauthorized);
}
var chain =new X509Chain {ChainPolicy = {RevocationMode = X509RevocationMode.NoCheck}};
if (chain.Build(cert) && cert.Issuer.Equals("CN=MobileTradeDataGateway"))
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, cert.Subject.Substring(3))
};
var principal = new ClaimsPrincipal(new[] {new ClaimsIdentity(claims, "X509")});
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
WebApiEventSource.Log.SuccessAuthenticate(cert.SubjectName.Name);
return await base.SendAsync(request, cancellationToken);
}
WebApiEventSource.Log.FailureAuthenticate("certificate is incorrect", cert.IssuerName.Name, cert.SubjectName.Name);
return request.CreateResponse(HttpStatusCode.Unauthorized);
}
}
Вы также пытались получить свой сертификат по "Thumbprint". Вот пример кода, который пытается прочитать сертификат из хранилища сертификатов.
private X509Certificate2 FindCertificate()
{
X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = certificateStore.Certificates;
X509Certificate2Collection matchingCertificates = certificates.Find(X509FindType.FindByThumbprint, "CertThumbprint", false);
if (matchingCertificates != null && matchingCertificates.Count > 0)
{
return matchingCertificates[0];
}
throw new ArgumentException("Unable to find a matching certificate in the certificate store. Please modify the search criteria.");
}
эта ссылка содержит больше информации о том, как вы можете прочитать сертификат из веб / рабочей роли