[.net] .NET에서 X509Certificate2와 X509Certificate의 차이점은 무엇입니까?
둘의 차이점은 무엇입니까?
답변
X509Certificate에이 .NET V1.0 도입 / 1.1이었다 (비교적)의 기능 제한. 기존 인증서 (유효 날짜, 발급자 등)에 대한 정보를 가져 오는 데 사용할 수 있습니다. 간단한 방법 / 작업 (즉, 디스크에서 인증서 읽기)이있었습니다.
x509Certificate2는 추가 기능과 X509Certificate에의 서브 클래스입니다.
- 실제 X509 인증서를 나타냅니다.
- .NET Framework v2.0의 새로운 기능입니다.
- 이 클래스는 모든 V2 및 V3 속성 (권한 키 식별자 및 키 사용)에 대한 액세스를 제공합니다.
- 인증서 저장소에서 인증서로드를 지원합니다.
답변
완전성을 위해 다음은 @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 개체를 만들 수있는 생성자가 있습니다.
답변
X.509 인증서를 “X509Certificate”에서 “X509Certificate2″로 변환하려면 다음과 같이하십시오.
X509Certificate X509 = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
답변
인증서를 읽고 이것을 사용하여 인증하려는 사람들은 간단히 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
}
}
남은 것은 클라이언트 인증서를 허용하도록 웹 서버를 설정하는 것입니다 … 새 형식에서 온 속성에 대한 모든 것을 읽을 수 있고 공용 웹 서비스를 보호했습니다. 인증을받는 것만으로는 충분하지 않기 때문에 대부분 실패하는 작업 더 이상 (만약 있다면)