2009-07-25 13 views

Odpowiedz

72

Urządzenie x509Certificate zostało wprowadzone w .NET v1.0/1.1 i było (względnie) ograniczone pod względem funkcjonalności. Można go użyć w celu uzyskania informacji o istniejącym certyfikacie (ważne daty, wystawca itp.). Miał proste metody/operacje (tj. Czytanie certyfikatu z dysku).

x509Certificate2 jest podklasą certyfikatu x509Certyfikat z dodatkową funkcjonalnością.

  • Reprezentuje rzeczywisty certyfikat X509.
  • To był nowy w .NET Framework v2.0.
  • Ta klasa zapewnia dostęp do wszystkich właściwości V2 i V3 (identyfikator klucza urzędu i użycie klucza).
  • Umożliwia ładowanie certyfikatu z magazynu certyfikatów.
+6

'X509Certyfikat2' ma także element klucza prywatnego, który nie jest częścią samego certyfikatu, ale jest wygodny do powiązania z przedstawicielem klasy ponowne wyrażenie zgody na certyfikat X.509. – Bruno

18

kompletności boską, tu jest kopia odpowiedniej sekcji site linked to w odpowiedzi @ Dommer za, ponieważ strona może nie być aż i tylko w pamięci podręcznej Google na nie wiadomo jak długo:

Wersja 1.1 szkieletu miała bardzo niewiele innych niż klasa X 509Certyfikat, umożliwiając manipulowanie certyfikatami. W klasie klasa v1.1 X509Certyfikacja zapewniała tylko podstawowe wsparcie: tylko dało dostęp do pól wersji X509 w wersji 1 (takich jak ważne od i ważnych dla dat, tematów i kluczy publicznych), ale nie do pól wersji 2 (takich jak identyfikator klucza autoryzacji) ani pola wersji 3 (jak użycie klucza). Nie było obsługi ładowania certyfikatu z magazynu certyfikatu , ani nie ma możliwości dostępu do certyfikatów certyfikatów lub list zaufanych certyfikatów. Microsoft poprawił to na dzięki zestawowi narzędzi Web Services Enhancement (WSE) rozszerzającemu klasę certyfikatów i udostępniając klasy w celu uzyskania dostępu do magazynów certyfikatów. Te klasy można teraz znaleźć w bibliotece framework .NET 3.0/2.0.

Pierwsza duża zmiana to nowa klasa o nazwie X509Certyfikat2, która wywodzi się z certyfikatu X509. Metody uzyskiwania dostępu do pól certyfikatów X509 zostały wycofane, a teraz klasa ma właściwości umożliwiające dostęp do tych pól. Ponadto, jeśli certyfikat ma powiązany klucz prywatny, to klasa daje dostęp do tego klucza. Istnieją metody, które umożliwiają podanie hasła, jeśli prywatny klucz jest chroniony przez jeden. Hasło jest przekazywane za pomocą parametru SecureString , który jest specjalnym rodzajem, który zapewnia, że ​​gdy obiekt nie będzie już używany, zajęte przez niego pamięć zostanie zapisane tak, aby nie można było odczytać hasła przez inny proces na komputerze. Zabezpieczone ciągi i inne formy chronionych danych zostaną omówione w dalszej części artykułu w sekcji .

Od X509Certificate2 wywodzi X509Certificate oznacza to, że może wywołać metody statycznej CreateFromeCertFile i CreateFromSignedFile przez klasę X509Certificate2.Jednak te metody zwracają obiekt X509Certificate i nie można odrzucić tego obiektu do obiektu X509Certificate2. Klasa X509Certificate została ulepszona w wersji 3.0/2.0: zapewnia ona dostęp do niektórych pól X509; zapewnia metody importu i eksportu do zainicjować obiekt z tablicy bajtów lub wygenerować tablicę bajtów z certyfikatu i ma konstruktory, które utworzą obiekt z pliku (ASN.1 DER) i z tablicy bajtów. Co ciekawe, klasa X509Certificate2 ma konstruktora, który może stworzyć obiekt X509Certificate2 z obiektu X509Certificate. Zauważ, że chociaż obiekt X509Certificate może pokazywać tylko pola X509v1, to może być on utworzony z certyfikatu X509v3, a więc jeśli utworzysz obiekt X509Certificate2 z obiektu X509Certificate, uzyskasz dostęp do pól X509v3 przez .

2

Aby przekonwertować cert X.509 z „X509Certificate” do „X509Certificate2”, spróbuj coś takiego:

X509Certificate X509 = sslStream.RemoteCertificate; 
X509Certificate2 X5092 = new X509Certificate2(X509); 
0

Dla tych, którzy chcieliby zapoznać się z certyfikatu i wykorzystać do uwierzytelnienia można by po prostu utwórz certyfikat X509Certificate2 i przekaż certyfikat X509 w jego konstruktorze.

Dla podpisanego zespołu (exe) kod byłby podobny do tego i pomijam walidację błędów dla uproszczenia.

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 jesteś klasy nie nazywa się MyClass, ale niektóre obiekty biznesowe, których można oczekiwać od usługi sieci web.

Możesz wysłać klasę do akcji, przesyłając wymaganą wartość nieruchomości: &. Teraz można zapewnić, że wniosek otrzymaniu wynosi od ważnego klienta mobilnego lub Windows czytając świadectwo żądania tak:

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 ustawić serwer WWW, aby zaakceptować certyfikaty klienta. .. Możesz przeczytać wszystko o właściwościach pochodzących z nowego formatu i zabezpieczyłeś swoją publiczną usługę sieciową, coś, czego większość nie zrobi, ponieważ samo autoryzowanie nie jest już wystarczająco dobre (jeśli kiedykolwiek było)

Powiązane problemy