是什么在.NET X509Certificate2和X509证书有什么区别?(What is the

2019-06-26 18:40发布

两者有什么区别?

Answer 1:

该X509证书 (相对的)限制在其功能是在.NET 1.0 / 1.1引入并且是。 它可以用来获取有关现有证书(有效日期,发行人等)的信息。 它有简单的方法/操作(即从磁盘读取一个证书)。

该x509Certificate2是X509证书的具有附加功能的一个子类。

  • 它代表了实际的X509证书。
  • 这是在.NET Framework 2.0版新。
  • 这个类,您可以访问所有的V2和V3的属性(权限密钥标识符和密钥使用)。
  • 它支持加载从证书存储证书。


Answer 2:

为了完整起见,这里是有关节的副本链接到的网站在@ dommer的答案,因为该网站可能不再起来,只有在谷歌的缓存谁不知多久呢:

该框架的1.1版本已经比X509Certificate类很少对方允许你操作证书。 实际上,V1.1 X509Certificate类只给出了基本的支持:只给访问X509版本1字段(如从有效,有效期至日期,主题和公钥),但不是版本2个字段(如授权密钥标识符),也不版本3个字段(如键使用)。 有没有支持加载从证书存储证书,也不具有访问证书吊销列表或证书信任列表的设施。 微软在这改善了与Web服务增强(WSE)工具包扩展的证书类并提供类访问证书存储。 这些类现在可以在.NET 3.0 / 2.0框架库中找到。

第一大变化是一个名为X509Certificate2新类从x509证书导出。 该方法来访问X509证书字段已被弃用,现在类具有访问这些字段。 此外,如果该证书具有相关的私钥则该类可以访问此密钥。 有迹象表明,让你提供一个密码,如果私钥是由一个受保护的方法。 密码是通过SecureString的参数,它是一种特殊类型的可以确保当对象不再使用它占用的内存将被覆盖,这样的密码不能被机器上的另一个进程读取通过。 安全字符串和其他形式的受保护的数据将在后面的部分覆盖。

由于X509Certificate2从x509证书派生这意味着你可以调用静态方法CreateFromeCertFile和CreateFromSignedFile通过X509Certificate2类。 然而,这些方法返回一个X509Certificate对象,你可以不下来施放此为X509Certificate2对象。 X509Certificate类已经在版本3.0 / 2.0得到改善:它提供属性来访问某些X509字段; 它提供了进出口方法来初始化从字节数组的物体或产生来自证书一个字节数组,它具有将创建从一个文件(ASN.1 DER)的对象,并从一个字节数组构造。 有趣的是,X509Certificate2类具有可以从一个X509Certificate对象创建X509Certificate2对象的构造。 需要注意的是,虽然X509Certificate对象只能说明X509v1领域它可以从采用X509v3证书被创建,因此,如果您创建一个X509Certificate对象的X509Certificate2对象,你将能够访问采用X509v3领域。



Answer 3:

若要转换来自“x509证书”到“X509Certificate2”的X.509证书,尝试是这样的:

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


Answer 4:

对于那些想读证书,并以此来验证人会简单地创建一个X509Certificate2并通过X509证书在它的构造。

对于签名的程序集(该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服务,这是大多数失败,因为只是被授权做的不够好了(如果它曾经是)



文章来源: What is the difference between X509Certificate2 and X509Certificate in .NET?