2009-07-25 25 views

Trả lời

72

x509Certificate được giới thiệu trong .NET v1.0/1.1 và (tương đối) bị hạn chế trong chức năng của nó. Nó có thể được sử dụng để nhận thông tin về chứng chỉ hiện có (ngày hợp lệ, tổ chức phát hành, v.v.). Nó có các phương thức/hoạt động đơn giản (nghĩa là đọc một chứng chỉ từ đĩa).

x509Certificate2 là một phân lớp của x509Certificate có chức năng bổ sung.

  • Nó đại diện cho chứng chỉ X509 thực tế.
  • Tính năng mới trong .NET Framework v2.0.
  • Lớp này cung cấp cho bạn quyền truy cập vào tất cả các thuộc tính V2 và V3 (mã định danh khóa cấp quyền và cách sử dụng khóa).
  • Nó hỗ trợ tải chứng chỉ từ cửa hàng chứng chỉ.
+6

'X509Certificate2' cũng có một thành viên cho khóa riêng, vốn không phải là một phần của chứng chỉ mà thuận tiện để kết hợp với lớp gửi lại chứng chỉ X.509. – Bruno

18

Đối với đầy đủ lợi ích, đây là một bản sao của bộ phận có liên quan của site linked to trong câu trả lời @ Dommer của, vì trang web có thể không còn được lên và chỉ trong bộ nhớ cache của Google cho người-biết-bao lâu:

Phiên bản 1.1 của khung có rất ít khác với lớp X509Certificate để cho phép bạn thao tác chứng chỉ. Trong thực tế , lớp X509Certificate v1.1 chỉ cung cấp hỗ trợ cơ bản: chỉ cấp quyền truy cập vào các trường phiên bản X509 (như hợp lệ và hợp lệ cho ngày, chủ đề và khóa công khai) nhưng không phải là trường phiên bản 2 (như mã định danh khóa chính) hoặc các trường phiên bản 3 (như cách sử dụng khóa ). Không có hỗ trợ để tải chứng chỉ từ chứng chỉ cửa hàng, cũng như không có cơ sở để truy cập chứng chỉ danh sách thu hồi hoặc danh sách tin cậy chứng chỉ. Microsoft đã cải tiến trên điều này với bộ công cụ Nâng cao Dịch vụ Web (WSE) mở rộng lớp học chứng chỉ và cung cấp các lớp học để truy cập các cửa hàng chứng chỉ. Các lớp này bây giờ có thể được tìm thấy trong thư viện khung công tác .NET 3.0/2.0.

Thay đổi lớn đầu tiên là một lớp mới gọi là X509Certificate2 mà có nguồn gốc từ X509Certificate. Các phương thức truy cập vào các trường chứng chỉ X509 không được chấp nhận và giờ đây lớp học có các thuộc tính để truy cập các trường đó. Ngoài ra, nếu chứng chỉ có khóa cá nhân được liên kết thì lớp đó cấp quyền truy cập vào khóa này. Có các phương pháp cho phép bạn cung cấp mật khẩu nếu khóa riêng được bảo vệ bằng một. Mật khẩu được chuyển qua tham số SecureString là một loại đặc biệt đảm bảo rằng khi đối tượng không còn được sử dụng, bộ nhớ mà nó chiếm sẽ được ghi trên mà mật khẩu không thể đọc được bằng một quá trình khác trên máy. Chuỗi bảo mật và các hình thức bảo vệ dữ liệu khác sẽ được đề cập trong phần sau.

Vì X509Certificate2 xuất phát từ X509Certificate nó có nghĩa là bạn có thể gọi các phương thức tĩnh CreateFromeCertFile và CreateFromSignedFile thông qua lớp X509Certificate2.Tuy nhiên, các phương thức này trả về đối tượng X509Certificate và bạn không thể giảm truyền đối tượng X509Certificate2. Lớp X509Certificate có được cải thiện trong phiên bản 3.0/2.0: nó cung cấp các thuộc tính để truy cập một số trường X509; nó cung cấp các phương thức Nhập và Xuất để khởi tạo một đối tượng từ một mảng byte hoặc tạo một mảng byte từ chứng chỉ và nó có các hàm tạo sẽ tạo một đối tượng từ một tệp (ASN.1 DER) và từ một mảng byte. Điều thú vị là lớp X509Certificate2 có một hàm tạo có thể tạo đối tượng X509Certificate2 từ một đối tượng X509Certificate. Lưu ý rằng mặc dù đối tượng X509Certificate chỉ có thể hiển thị các trường X509v1 nó có thể được tạo từ chứng chỉ X509v3 và vì vậy nếu bạn tạo một đối tượng X509Certificate2 từ đối tượng X509Certificate, bạn sẽ là có thể truy cập vào các trường X509v3.

2

Để chuyển đổi một cert X.509 từ "X509Certificate" thành "X509Certificate2", hãy thử một cái gì đó như thế này:

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

Đối với những người muốn đọc giấy chứng nhận và sử dụng để xác thực người ta sẽ chỉ cần tạo một X509Certificate2 và vượt qua X509Certificate trong hàm tạo của nó.

Đối với một hội đồng đã ký (ví dụ) mã sẽ là mã như thế này và tôi bỏ qua xác thực lỗi để đơn giản.

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); 
    } 
} 

Rõ ràng bạn là lớp không được gọi là MyClass nhưng một số đối tượng kinh doanh mà bạn mong đợi từ dịch vụ web.

Bạn có thể gửi lớp học cho hành động của mình bằng cách gửi thuộc tính & giá trị mà bạn yêu cầu điền. Bây giờ bạn có thể đảm bảo rằng các yêu cầu mà bạn nhận được là từ một khách hàng điện thoại di động hoặc các cửa sổ hợp lệ bằng cách đọc các giấy chứng nhận yêu cầu như vậy:

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 
    } 

}

Những gì còn lại là để thiết lập máy chủ web của bạn để chấp nhận chứng chỉ của khách hàng. .. Bạn có thể đọc tất cả các thuộc tính đến từ định dạng mới và bạn đã bảo mật dịch vụ web công khai của mình, điều gì đó không thực hiện được khi được ủy quyền không đủ tốt nữa (nếu có)

Các vấn đề liên quan