2つの違いは何ですか?
回答:
X509Certificateには、 .NET v1.0デベロッパー/ 1.1で導入し、(比較的)その機能に限られていました。既存の証明書に関する情報(有効な日付、発行者など)を取得するために使用できます。シンプルなメソッド/操作(つまり、ディスクから証明書を読み取る)がありました。
x509Certificate2は、追加機能とのX509Certificateのサブクラスです。
完全を期すために、@ dommerの回答にリンクされているサイトの関連セクションのコピーを次に示します。これは、サイトが稼働しておらず、Googleのキャッシュに誰が知っているかだけの長さがあるためです。
フレームワークのバージョン1.1には、証明書を操作するためのX509Certificateクラス以外はほとんどありませんでした。実際、v1.1 X509Certificateクラスは基本的なサポートのみを提供しました。X509バージョン1フィールド(有効開始日と有効終了日、サブジェクト、公開キーなど)へのアクセスのみを提供し、バージョン2フィールド(認証機関キー識別子など)へのアクセスを許可しませんでした。 )バージョン3のフィールド(キーの使用法など)もありません。証明書ストアから証明書を読み込むサポートはありませんでした。また、証明書失効リストや証明書信頼リストにアクセスする機能もありませんでした。Microsoftは、証明書クラスを拡張し、証明書ストアにアクセスするためのクラスを提供するWeb Services Enhancement(WSE)ツールキットでこれを改善しました。これらのクラスは、.NET 3.0 / 2.0フレームワークライブラリにあります。
最初の大きな変更は、X509Certificateから派生したX509Certificate2という新しいクラスです。X509証明書フィールドにアクセスするためのメソッドは非推奨になり、クラスにはそれらのフィールドにアクセスするためのプロパティがあります。さらに、証明書に秘密鍵が関連付けられている場合、クラスはこの鍵へのアクセスを許可します。秘密鍵がパスワードで保護されている場合に、パスワードを提供できる方法があります。パスワードは、オブジェクトが使用されなくなったときに、占有されていたメモリが確実に上書きされ、マシン上の別のプロセスがパスワードを読み取れないようにする特別なタイプのSecureStringパラメータを介して渡されます。安全な文字列やその他の形式の保護データについては、後のセクションで説明します。
X509Certificate2はX509Certificateから派生しているため、X509Certificate2クラスを介して静的メソッドCreateFromeCertFileおよびCreateFromSignedFileを呼び出すことができます。ただし、これらのメソッドはX509Certificateオブジェクトを返すため、これをX509Certificate2オブジェクトにダウンキャストすることはできません。X509Certificateクラスは、バージョン3.0 / 2.0で改善されました。X509フィールドの一部にアクセスするためのプロパティを提供します。バイト配列からオブジェクトを初期化するか、証明書からバイト配列を生成するImportメソッドとExportメソッドを提供し、ファイル(ASN.1 DER)とバイト配列からオブジェクトを作成するコンストラクターを備えています。興味深いことに、X509Certificate2クラスには、X509CertificateオブジェクトからX509Certificate2オブジェクトを作成できるコンストラクターがあります。
証明書を読み取り、これを認証に使用したい場合は、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ではなく、Webサービスから期待されるビジネスオブジェクトです。
必要なプロパティと値を入力して、アクションにクラスを送信できます。次のようにリクエスト証明書を読み取ることで、受信したリクエストが有効なモバイルまたは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
}
}
残っているのは、クライアント証明書を受け入れるようにWebサーバーを設定することです...新しい形式から取得したプロパティについてすべて読むことができ、パブリックWebサービスを保護しました。承認されただけでは不十分なので、ほとんどの場合失敗します。もう(それがあったなら)
X509Certificate2
には秘密鍵のメンバーもあります。秘密鍵は証明書自体の一部ではありませんが、X.509証明書を表すクラスに関連付けると便利です。