两者有什么区别?
Answers:
在X509证书(相对的)限制在其功能是在.NET 1.0引入/ 1.1和是。它可用于获取有关现有证书的信息(有效日期,颁发者等)。它具有简单的方法/操作(即从磁盘读取证书)。
x509Certificate2是具有附加功能的x509Certificate的子类。
为了完整起见,这里是@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对象的构造函数。
对于那些想读取证书并使用它来进行身份验证的人,只需创建一个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证书的类关联。