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


Answers:


104

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

x509Certificate2是具有附加功能的x509Certificate的子类。

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

12
X509Certificate2还具有私钥的成员,该私钥不是证书本身的一部分,但是很方便与代表X.509证书的类关联。
布鲁诺

21

为了完整起见,这里是@dommer答案中链接到网站相关部分的副本,因为该网站可能不再启动,并且仅在Google缓存中知道了多长时间:

该框架的1.1版除X509Certificate类外几乎没有其他内容可用于操作证书。实际上,v1.1 X509Certificate类仅提供基本支持:它仅提供对X509版本1字段(如有效起始日期和有效日期,主题和公钥)的访问,而没有提供对版本2字段(如授权密钥标识符)的访问。 )或版本3字段(例如密钥用法)。不支持从证书存储中加载证书,也没有访问证书吊销列表或证书信任列表的功能。Microsoft通过Web服务增强(WSE)工具包对此进行了改进,该工具包扩展了证书类并提供了用于访问证书存储的类。现在,可以在.NET 3.0 / 2.0框架库中找到这些类。

第一个大变化是一个名为X509Certificate2的新类,该类继承自X509Certificate。不赞成使用X509证书字段的方法,现在该类具有访问这些字段的属性。另外,如果证书具有关联的私钥,则该类可以访问此密钥。如果私钥受一个保护,则有一些方法可以让您提供密码。密码通过SecureString参数传递,该参数是一种特殊类型,可确保当不再使用该对象时,将覆盖该对象占用的内存,以使该密码不会被机器上的另一个进程读取。安全字符串和其他形式的受保护数据将在后面的部分中介绍。

由于X509Certificate2派生自X509Certificate,因此这意味着您可以通过X509Certificate2类调用静态方法CreateFromeCertFile和CreateFromSignedFile。但是,这些方法返回一个X509Certificate对象,您不能将其强制转换为X509Certificate2对象。X509Certificate类在3.0 / 2.0版中进行了改进:它提供了一些访问X509字段的属性;它提供了Import和Export方法来从字节数组初始化对象或从证书生成字节数组,并且它具有构造函数,这些构造函数将从文件(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,而是您希望从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服务的安全,这是大多数事情所不能做的,因为仅仅被授权还不够好不再(如果曾经)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.