C#中使用X509Certificate2类获取数字证书颁发者和持有者的名称信息
2015-04-23 18:07
447 查看
在 .NET Framework 中有一个名为 X509Certificate2 的类,使用该类包含的属性可以方便地获得 X.509 格式数字证书中的序列号、有效期起始日、有效期终止日等信息。在MSDN网站上可以查到关于该类的详细说明。
在该类的属性中,Issuer 和 IssuerName、Subject 和 SubjectName 这两对看起来比较像,容易让人混淆。这里做一下说明:
1) Issuer 和 Subject 属性的类型都是 string,使用这两个属性,可以分别得到证书颁发者和证书持有者的 Distinguished Name。Distinguished Name 通常是一个类似下面形式的字符串:"CN=MyName, O=MyOrg, OU=MyOrgUnit, C=US"
这种字符串内部用 , 作为分隔符(注意是英文中的逗号,不是中文中的逗号),其中 CN 代表 Common Name,O 代表组织名,OU 代表组织下属机构名,C 代表国家名。
2) IssuerName 和 SubjectName 属性的类型都是 System.Security.Cryptography.X509Certificates.X500DistinguishedName,注意不是 string。X500DistinguishedName 有三个属性,分别是:Name, Oid 和 RawData。使用 Name 属性也可以获得 Distinguished Name。即:
X509Certificate2.Issuer 与 X509Certificate2.IssuerName.Name 的值是相等的;
X509Certificate2.Subject 与 X509Certificate2.SubjectName.Name 的值是相等的。
对于证书颁发者或持有者的 Distinguished Name,经常被用到的部分是其中的 Common Name,即 CN= 后面的内容。但是 .NET Framework 中并没有直接提供从 Distinguished Name 中提取出 Common Name 的方法。由于 Distinguished Name 的内部是用 , 来隔开不同含义的部分,于是就可以用 , 作为分隔符,将 Distinguished Name 拆分为多个子串,然后在子串中查找 CN= ,找到以后把 CN=
后面的部分提取出来,这样就可以得到 Common Name 的值了。具体实现代码如下:
在该类的属性中,Issuer 和 IssuerName、Subject 和 SubjectName 这两对看起来比较像,容易让人混淆。这里做一下说明:
1) Issuer 和 Subject 属性的类型都是 string,使用这两个属性,可以分别得到证书颁发者和证书持有者的 Distinguished Name。Distinguished Name 通常是一个类似下面形式的字符串:"CN=MyName, O=MyOrg, OU=MyOrgUnit, C=US"
这种字符串内部用 , 作为分隔符(注意是英文中的逗号,不是中文中的逗号),其中 CN 代表 Common Name,O 代表组织名,OU 代表组织下属机构名,C 代表国家名。
2) IssuerName 和 SubjectName 属性的类型都是 System.Security.Cryptography.X509Certificates.X500DistinguishedName,注意不是 string。X500DistinguishedName 有三个属性,分别是:Name, Oid 和 RawData。使用 Name 属性也可以获得 Distinguished Name。即:
X509Certificate2.Issuer 与 X509Certificate2.IssuerName.Name 的值是相等的;
X509Certificate2.Subject 与 X509Certificate2.SubjectName.Name 的值是相等的。
对于证书颁发者或持有者的 Distinguished Name,经常被用到的部分是其中的 Common Name,即 CN= 后面的内容。但是 .NET Framework 中并没有直接提供从 Distinguished Name 中提取出 Common Name 的方法。由于 Distinguished Name 的内部是用 , 来隔开不同含义的部分,于是就可以用 , 作为分隔符,将 Distinguished Name 拆分为多个子串,然后在子串中查找 CN= ,找到以后把 CN=
后面的部分提取出来,这样就可以得到 Common Name 的值了。具体实现代码如下:
/************************************************** * Author: HAN Wei * Author's blog: http://blog.csdn.net/henter/ * Date: April 23rd, 2015 * Description: demonstrate how to extract Common Name * from Distinguished Name **************************************************/ using System; namespace ExtractCnFromDn { class Program { public static string ExtractCommonNameFromDN(string DistinguishedName) { if (String.IsNullOrEmpty(DistinguishedName)) { throw new ArgumentNullException("Distinguishedname"); } string strCommonName = string.Empty; string strStartSubStr = "CN="; char[] chDelimiterChars = { ',' }; string[] NameArray = DistinguishedName.Split(chDelimiterChars); int iNameLength = 0; string strSubStr1 = string.Empty; string strSubStr2 = string.Empty; for (int i = 0; i < NameArray.Length; i++) { strSubStr1 = NameArray[i].Trim(); iNameLength = strSubStr1.Length; if (iNameLength > 3) { strSubStr2 = strSubStr1.Substring(0, 3); if (String.Compare(strStartSubStr, strSubStr2, true) == 0) { strCommonName = strSubStr1.Substring(3, (iNameLength - 3)); break; } } } return strCommonName; } /*************************************************/ static void Main(string[] args) { string strDn = "E=test@abc.com, CN=测试人员, S=上海市, C=CN"; /* 注意这里的 , 不是中文里的逗号 */ string strCn = string.Empty; try { strCn = ExtractCommonNameFromDN(strDn); } catch (ArgumentNullException e) { Console.WriteLine("Error message: {0}", e.Message); Console.ReadLine(); return; } Console.WriteLine("Distinguished name: {0}", strDn); if (String.IsNullOrEmpty(strCn)) { Console.WriteLine("Common name not found!"); } else { Console.WriteLine("Common name: {0}", strCn); } Console.ReadLine(); return; } } }
相关文章推荐
- 使用c#调用oracle存储过程获取存储过程参数信息
- C#使用反射机制获取类信息
- C#使用反射机制获取类信息
- C#使用反射机制获取类信息
- OpenSSL学习之使用个人信息数字证书(PFX)进行签名和验证
- C#如何使用GetTcpTable API获取TCP/IP连接信息
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- 【20090903-01】C#中使用ManagementClass获取本机信息
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- ASP.NET(C#)中如何获取IP,名称,操作系统,浏览器等信息
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密(转)
- C#中使用ManagementClass获取本机信息
- c#.net使用WinAPI: GetComputerName - 获取计算机名称
- ASP.NET(C#)中获取IP,名称,操作系统,浏览器等信息代码大全
- C# 获取文件的数字签名信息
- C#使用反射机制获取类信息
- (转)C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- 本文使用c#通过oledb可获取excel文件表的结构信息,同理也可以获得access等数据库的表结构信息,实现如下: