Какая разница между двумя?
94
Какая разница между двумя?
X509Certificate был введен в .NET 1.0 / 1.1 и был (сравнительно) ограничен в своей функциональности. Его можно использовать для получения информации о существующем сертификате (действительные даты, эмитент и т. Д.). У него были простые методы / операции (например, чтение сертификата с диска).
X509Certificate2 подкласс X509Certificate с дополнительными функциональными возможностями .
X509Certificate2
также имеет член для закрытого ключа, который не является частью самого сертификата, но его удобно связать с классом, представляющим сертификат X.509.Для полноты, вот копия соответствующего раздела сайта, на который есть ссылка в ответе @dommer, поскольку сайт может больше не работать и находится в кеше Google неизвестно как долго:
источник
Чтобы преобразовать сертификат X.509 из «X509Certificate» в «X509Certificate2», попробуйте что-то вроде этого:
источник
Для тех, кто хотел бы прочитать сертификат и использовать его для аутентификации, можно просто создать X509Certificate2 и передать X509Certificate в его конструктор.
Для подписанной сборки (exe) код будет таким, и для простоты я опускаю проверку ошибок.
Module m = Assembly.GetEntryAssembly().GetModules()[0]; using (var cert = m.GetSignerCertificate()) using (var cert2 = new X509Certificate2(cert)) { var _clientHandler = new HttpClientHandler(); _clientHandler.ClientCertificates.Add(cert2); _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual; var myModel = new Dictionary<string, string> { { "property1","value" }, { "property2","value" }, }; using (var content = new FormUrlEncodedContent(myModel)) using (var _client = new HttpClient(_clientHandler)) using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result) { response.EnsureSuccessStatusCode(); string jsonString = response.Content.ReadAsStringAsync().Result; var json = new Newtonsoft.Json.JsonSerializer(); var myClass = JsonConvert.DeserializeObject<MyClass>(json); } }
Очевидно, ваш класс называется не MyClass, а бизнес-объектом, который вы ожидаете от веб-службы.
Вы можете отправить класс своему действию, отправив свойство и значение, которое вам нужно заполнить. Теперь вы можете убедиться, что запрос, который вы получили, поступил от действующего мобильного клиента или клиента Windows, прочитав сертификат запроса следующим образом:
public class MyController : ApiController { public IHttpActionResult Get() { X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate; if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber)) { Response.StatusCode = 404; return null; } //your code }
}
Осталось настроить ваш веб-сервер на прием клиентских сертификатов ... Вы можете прочитать все о свойствах, которые поступают из нового формата, и вы обезопасили свою общедоступную веб-службу, чего не удается сделать, так как просто авторизации недостаточно. больше (если это когда-либо было)
источник