Sự khác biệt giữa X509Certificate2 và X509Certificate trong .NET là gì?


Câu trả lời:


104

Các X509Certificate được giới thiệu vào NET v1.0 / 1.1 và là (tương đối) hạn chế về chức năng của nó. Nó có thể được sử dụng để lấy 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 (tức là đọc một cert từ đĩa).

Các x509Certificate2 là một lớp con của X509Certificate với chức năng bổ sung.

  • Nó đại diện cho một chứng chỉ X509 thực tế.
  • Nó là 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 quyền và cách sử dụng khóa).
  • Nó hỗ trợ tải chứng chỉ từ kho chứng chỉ.

12
X509Certificate2cũng có một thành viên cho khóa riêng tư, không phải là một phần của chính chứng chỉ nhưng rất tiện lợi khi được liên kết với lớp đại diện cho chứng chỉ X.509.
Bruno

21

Vì lợi ích của sự hoàn chỉnh, đây là bản sao của phần có liên quan của trang web được liên kết đến trong câu trả lời của @ dommer, vì trang web có thể không hoạt động nữa và chỉ nằm trong bộ nhớ cache của Google trong thời gian bao lâu:

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

Thay đổi lớn đầu tiên là một lớp mới được gọi là X509Certificate2 có nguồn gốc từ X509Certificate. Các phương thức truy cập các trường chứng chỉ X509 đã không còn được dùng nữa và giờ đây lớp 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 riêng được liên kết thì lớp cấp quyền truy cập vào khóa này. Có những 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ởi một. Mật khẩu được chuyển qua tham số SecureString, đây là một kiểu đặ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 lại để mật khẩu không thể đọc được bởi một quá trình khác trên máy. Chuỗi an toàn và các dạng dữ liệu được bảo vệ khác sẽ được đề cập trong phần sau.

Vì X509Certificate2 bắt nguồn từ X509Certificate nên 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ề một đối tượng X509Certificate và bạn không thể truyền xuống đối tượng X509Certificate2. Lớp X509Certificate đã được cải tiế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 một đối tượng X509Certificate2 từ một đối tượng X509Certificate.


6

Để chuyển đổi chứng chỉ X.509 từ "X509Certificate" thành "X509Certificate2", hãy thử như sau:

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

2

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

Đối với một assembly đã ký (exe), 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 là lớp của bạn không được gọi là MyClass mà là một số đối tượng kinh doanh mà bạn mong đợi từ dịch vụ web.

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

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
   }

}

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.