程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中使用X509Certificate2類獲取數字證書頒發者和持有者的名稱信息

C#中使用X509Certificate2類獲取數字證書頒發者和持有者的名稱信息

編輯:C#入門知識

C#中使用X509Certificate2類獲取數字證書頒發者和持有者的名稱信息


在 .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=測試人員, [email protected], 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;
        }
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved