.NET中的X509Certificate2和X509Certificate有什么区别?

时间:2009-07-25 17:48:20

标签: .net ssl certificate x509certificate

两者有什么区别?

4 个答案:

答案 0 :(得分:89)

x509Certificate是在.NET v1.0 / 1.1中引入的,并且(相对)功能有限。 它可用于获取有关现有证书的信息(有效日期,颁发者等)。它有简单的方法/操作(即从磁盘读取证书)。

x509Certificate2是x509Certificate的子类,具有其他功能。

  • 它代表一个实际的X509证书。
  • 它是.NET Framework v2.0中的新功能。
  • 此类允许您访问所有V2和V3属性(权限密钥标识符和密钥用法)。
  • 它支持从证书存储区加载证书。

答案 1 :(得分:19)

为了完整起见,以下是@ dommer的答案中site linked to的相关部分的副本,因为该网站可能不再起作用,并且仅在Google的缓存中显示谁知道多长时间:< / p>

  

该框架的1.1版本除了之外几乎没有   X509Certificate类允许您操作证书。在   事实上,v1.1 X509Certificate类只提供了基本支持:它只是   允许访问X509版本1字段(例如有效的from和   对日期,主题和公钥有效但不是版本2字段(如   权限密钥标识符)也不是版本3字段(如密钥   用法)。无法从证书加载证书   商店,也没有获得证书的设施   吊销列表或证书信任列表。微软改进了   这与Web服务增强(WSE)工具包扩展了   证书类并提供访问证书库的类。   现在可以在.NET 3.0 / 2.0框架库中找到这些类。

     

第一个重大变化是一个名为X509Certificate2的新类   源自X509Certificate。访问X509的方法   证书字段已被弃用,现在该类已有   用于访问这些字段的属性。另外,如果证书有   一个关联的私钥然后该类提供对该密钥的访问。   有些方法允许您在私有时提供密码   密钥受一个人保护。密码通过SecureString传递   参数是一种特殊类型,确保当对象时   不再使用它占用的内存将被写入   机器上的其他进程无法读取密码。   安全字符串和其他形式的受保护数据将包含在内   后面的部分。

     

由于X509Certificate2派生自X509Certificate,因此意味着你   可以调用静态方法CreateFromeCertFile和   CreateFromSignedFile通过X509Certificate2类。然而,   这些方法返回一个X509Certificate对象,你不能失败   将其强制转换为X509Certificate2对象。 X509Certificate类有   在版本3.0 / 2.0中得到了改进:它提供了访问属性   一些X509领域;它提供了导入和导出方法   从字节数组初始化对象或从中生成字节数组   证书,它具有将创建对象的构造函数   来自文件(ASN.1 DER)和字节数组。有趣的是,   X509Certificate2类有一个可以创建的构造函数   来自X509Certificate对象的X509Certificate2对象。注意   虽然X509Certificate对象只能显示X509v1字段   可以从X509v3证书创建,因此如果您创建一个   您将成为X509Certificate对象的X509Certificate2对象   能够访问X509v3字段。

答案 2 :(得分:4)

从&#34; X509Certificate&#34;转换X.509证书到&#34; X509Certificate2&#34;,尝试这样的事情:

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

答案 3 :(得分:0)

对于那些想要阅读证书并使用它来进行身份验证的人,只需创建一个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服务获得的一些业务对象。

您可以通过发送属性&amp;发送课程。你需要填写的价值。您现在可以通过阅读请求证书来确保您收到的请求来自有效的移动或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服务,这是大多数情况下无法完成的,因为只是被授权不是'足够好了(如果有的话)