码迷,mamicode.com
首页 > Windows程序 > 详细

C#中使用X509Certificate2类获取数字证书颁发者和持有者的名称信息

时间:2015-04-23 19:58:25      阅读:646      评论:0      收藏:0      [点我收藏+]

标签:c#

        在 .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 的值了。具体实现代码如下:

/**************************************************  
* 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;
            bool bFoundSubStr = false;
            string strStartSubStr = "CN=";
            char[] chDelimiterChars = { ',' };
            string[] NameArray = DistinguishedName.Split(chDelimiterChars);
            int iNameLength;
            for (int i = 0; i < NameArray.Length; i++)
            {
                iNameLength = NameArray[i].Length;
                if (iNameLength > 3)
                {
                    if (String.Compare(strStartSubStr, NameArray[i].Substring(0, 3), true) == 0)
                    {
                        strCommonName = NameArray[i].Substring(3, (iNameLength - 3));
                        bFoundSubStr = true;
                        break;
                    }
                }
            }

            if (bFoundSubStr == false)
                strCommonName = string.Empty;
            return strCommonName;
        }

        /*************************************************/
        static void Main(string[] args)
        {
            string strDn = "CN=测试人员, E=test@abc.com, 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);
            Console.WriteLine("Common name: {0}", strCn);
            Console.ReadLine();
            return;
        }
    }
}


 

C#中使用X509Certificate2类获取数字证书颁发者和持有者的名称信息

标签:c#

原文地址:http://blog.csdn.net/henter/article/details/45224895

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!