Jaka jest różnica między nimi?
94
X509Certificate wprowadzono NET v1.0 / 1.1 i był (stosunkowo) ogranicza jego funkcjonalności. Można go wykorzystać do uzyskania informacji o istniejącym certyfikacie (ważne daty, wystawca itp.). Miał proste metody / operacje (np. Odczyt certyfikatu z dysku).
X509Certificate2 jest podklasą x509Certificate z dodatkową funkcjonalnością.
X509Certificate2
ma również członka klucza prywatnego, który nie jest częścią samego certyfikatu, ale wygodnie jest go powiązać z klasą reprezentującą certyfikat X.509.Dla zachowania kompletności, poniżej znajduje się kopia odpowiedniej sekcji witryny, do której link znajduje się w odpowiedzi @ dommer, ponieważ witryna może już nie działać i może znajdować się tylko w pamięci podręcznej Google, kto wie jak długo:
źródło
Aby przekonwertować certyfikat X.509 z „X509Certificate” na „X509Certificate2”, wypróbuj coś takiego:
źródło
Dla tych, którzy chcieliby odczytać certyfikat i użyć go do uwierzytelnienia, wystarczy utworzyć X509Certificate2 i przekazać X509Certificate w jego konstruktorze.
W przypadku podpisanego zestawu (exe) kod byłby taki jak ten, a dla uproszczenia pomijam sprawdzanie poprawności błędów.
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); } }
Oczywiście Twoja klasa nie nazywa się MyClass, ale jest obiektem biznesowym, którego można oczekiwać od usługi internetowej.
Możesz wysłać klasę do swojego działania, wysyłając wypełnioną właściwość i wartość. Możesz teraz upewnić się, że otrzymane żądanie pochodzi od prawidłowego klienta mobilnego lub Windows, czytając certyfikat żądania w następujący sposób:
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 }
}
Pozostaje tylko ustawić serwer WWW tak, aby akceptował certyfikaty klienta ... Możesz przeczytać wszystko o właściwościach, które pochodzą z nowego formatu i zabezpieczyłeś swoją publiczną usługę sieciową. już (jeśli kiedykolwiek był)
źródło