.NET에서 X509Certificate2와 X509Certificate의 차이점은 무엇입니까?


답변:


106

X509Certificate에이 .NET V1.0 도입 / 1.1이었다 (비교적)의 기능 제한. 기존 인증서 (유효 날짜, 발급자 등)에 대한 정보를 가져 오는 데 사용할 수 있습니다. 간단한 방법 / 작업 (즉, 디스크에서 인증서 읽기)이있었습니다.

x509Certificate2는 추가 기능과 X509Certificate에의 서브 클래스입니다.

  • 실제 X509 인증서를 나타냅니다.
  • .NET Framework v2.0의 새로운 기능입니다.
  • 이 클래스는 모든 V2 및 V3 속성 (권한 키 식별자 및 키 사용)에 대한 액세스를 제공합니다.
  • 인증서 저장소에서 인증서로드를 지원합니다.

12
X509Certificate2또한 인증서 자체의 일부는 아니지만 X.509 인증서를 나타내는 클래스와 연결하는 것이 편리한 개인 키에 대한 멤버도 있습니다.
브루노

21

완전성을 위해 다음은 @dommer의 답변에 링크 된 사이트 의 관련 섹션의 사본입니다 .

프레임 워크 버전 1.1에는 인증서를 조작 할 수있는 X509Certificate 클래스 외에는 거의 없었습니다. 실제로 v1.1 X509Certificate 클래스는 기본 지원 만 제공했습니다. X509 버전 1 필드 (유효한 시작 및 유효 종료 날짜, 제목 및 공개 키와 같은)에만 액세스 권한을 부여했지만 버전 2 필드 (권한 키 식별자와 같은)에는 액세스하지 못했습니다. ) 또는 버전 3 필드 (예 : 키 사용). 인증서 저장소에서 인증서를로드하는 기능이 지원되지 않았으며 인증서 해지 목록 또는 인증서 신뢰 목록에 액세스 할 수있는 기능도 없습니다. Microsoft는 인증서 클래스를 확장하고 인증서 저장소에 액세스 할 수있는 클래스를 제공하는 WSE (Web Services Enhancement) 툴킷을 통해이를 개선했습니다. 이러한 클래스는 이제 .NET 3.0 / 2.0 프레임 워크 라이브러리에서 찾을 수 있습니다.

첫 번째 큰 변화는 X509Certificate에서 파생 된 X509Certificate2라는 새로운 클래스입니다. X509 인증서 필드에 액세스하는 메서드는 더 이상 사용되지 않으며 이제 클래스에 해당 필드에 액세스 할 수있는 속성이 있습니다. 또한 인증서에 연결된 개인 키가 있으면 클래스에서이 키에 대한 액세스 권한을 부여합니다. 개인 키가 보호되는 경우 암호를 제공 할 수있는 방법이 있습니다. 암호는 개체가 더 이상 사용되지 않을 때 컴퓨터의 다른 프로세스에서 암호를 읽을 수 없도록 해당 개체가 차지하는 메모리를 덮어 쓰도록하는 특수 유형 인 SecureString 매개 변수를 통해 전달됩니다. 보안 문자열 및 기타 형식의 보호 된 데이터는 이후 섹션에서 다룹니다.

X509Certificate2는 X509Certificate에서 파생되므로 X509Certificate2 클래스를 통해 정적 메서드 CreateFromeCertFile 및 CreateFromSignedFile을 호출 할 수 있습니다. 그러나 이러한 메서드는 X509Certificate 개체를 반환하며이를 X509Certificate2 개체로 다운 캐스트 할 수 없습니다. X509Certificate 클래스는 버전 3.0 / 2.0에서 개선되었습니다. 일부 X509 필드에 액세스 할 수있는 속성을 제공합니다. 가져 오기 및 내보내기 메서드를 제공하여 바이트 배열에서 개체를 초기화하거나 인증서에서 바이트 배열을 생성하며 파일 (ASN.1 DER) 및 바이트 배열에서 개체를 만드는 생성자가 있습니다. 흥미롭게도 X509Certificate2 클래스에는 X509Certificate 개체에서 X509Certificate2 개체를 만들 수있는 생성자가 있습니다.


6

X.509 인증서를 "X509Certificate"에서 "X509Certificate2"로 변환하려면 다음과 같이하십시오.

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

2

인증서를 읽고 이것을 사용하여 인증하려는 사람들은 간단히 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
   }

}

남은 것은 클라이언트 인증서를 허용하도록 웹 서버를 설정하는 것입니다 ... 새 형식에서 온 속성에 대한 모든 것을 읽을 수 있고 공용 웹 서비스를 보호했습니다. 인증을받는 것만으로는 충분하지 않기 때문에 대부분 실패하는 작업 더 이상 (만약 있다면)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.