2009-09-10 2 views
2

Я пытаюсь установить дружественное имя сертификата во время процесса запроса/принятия сертификата. Я понимаю, что это свойство хранилища microsoft, а не сертификат, и интересно, какой метод .net/C# можно использовать для его установки.Настройка Сертификат Дружественное имя

ответ

1

Итак, вот пример линии, как это сделать. Вам нужен CAPICOM от microsoft, который обертывает CryptoAPI.

Дружественное имя является свойством хранилища сертификатов, а не сертификата, поэтому этот код импортирует сертификат в хранилище сертификатов и устанавливает дружественное имя, как он это делает.

Код принимает два параметра: путь к файлу сертификата и дружественное имя, которое вы хотите установить.

Код: -

using System; 

using System.Collections.Generic; 

using System.Text; 

using CAPICOM; 

using System.Collections; 

using System.Runtime.InteropServices; 


namespace CertTool 

{ 

    class Program 
    { 
     const uint CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000; 
     const int CAPICOM_PROPID_FRIENDLY_NAME = 11; 
     const int CAPICOM_ENCODE_BINARY = 1; 

     static private String _currStoreName = "My"; 
     static private String _FriendlyName = "Not Set"; 
     static private String _CertPath = "C:\\test.cer"; 
     static StoreClass _oCurrStore; 
     static ExtendedPropertyClass _friendlyProp; 
     static CertificateClass _certificate; 
     static ExtendedProperties _extendedProp; 

     static void Main(string[] args) 
     { 
      try 
      { 
       //Friendly name Argument 
       if (args.Length > 0) 
       { 
        _FriendlyName = args[0]; 
       } 
       //Certpath argument 
       if (args.Length > 1) 
       { 
        _CertPath = args[1]; 
       } 
       //Set and open the Store 
       _oCurrStore = new StoreClass(); 
       _oCurrStore.Open(
        CAPICOM_STORE_LOCATION.CAPICOM_LOCAL_MACHINE_STORE, 
        _currStoreName, 
        CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY | 
        CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); 
       //Call the import certificate function 
       importCert(); 
      } 
      catch(Exception ex){ 
       Console.WriteLine(ex.Message); 
       Console.WriteLine(args[0]); 
      } 
     } 
     //Function import the certificate to the machine store and sets the friendly name 
     static bool importCert() 
     { 
      try 
      { 
       //Create Certificate Object 
       _certificate = new CertificateClass(); 
       //Load the certificate into the obejct from file 
       _certificate.Load(_CertPath, "", CAPICOM_KEY_STORAGE_FLAG.CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_KEY_LOCATION.CAPICOM_LOCAL_MACHINE_KEY); 
       //Create extended property Class for friendly name 
       _friendlyProp = new ExtendedPropertyClass(); 
       _friendlyProp.PropID = CAPICOM_PROPID.CAPICOM_PROPID_FRIENDLY_NAME; 
       _friendlyProp.set_Value(CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY, _FriendlyName); 

       //Add extendedProp on cert object 
       _extendedProp = _certificate.ExtendedProperties(); 
       //Set extendded prop to friendly name object 
       _extendedProp.Add(_friendlyProp); 
       _oCurrStore.Add(_certificate); 
       return true; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(_CertPath); 
       return true; 
      } 
     } 
    } 
} 
0

Хорошо, нашли ответ на этот вопрос здесь:

Привет,

Пожалуйста, обратите внимание на это, чтобы проверить, подходит ли он ваши потребности:

Когда вы запустите .net-код в среде X64, вы получите следующее сообщение об ошибке.

"Не удалось --Retrieving СОМ фабрику классов для компонента с CLSID ...."

Э.Г. на стороне сервера экспорта/импорта CMS .net code = «ExportSiteContentIncremental (...) Failed - Ошибка возврата фабрике COM-класса для компонента с CLSID {CA0752B3-021C-4F99-82E3-2C0F19C5E953} из-за следующей ошибки: 80040154 «.

РЕШЕНИЕ:

Возможным решением является изменение платформы вашего проекта от 'Any CPU' до 'X86' (в свойствах проекта, цель сборки/платформы)

ROOTCAUSE

ВСС Interop является управляемой сборкой с использованием 32-разрядной Framework, а dll содержит 32-битный COM-объект. Если вы запустите эту COM-библиотеку в 64-разрядной среде, вы получите сообщение об ошибке.

1

Используйте X509Certificate2.FriendlyName. Тем не менее, вы должны экспортировать сертификат в PFX/PKCS # 12:

X509Certificate2 certificate = new X509Certificate2(...); 
certificate.FriendlyName = "MyName"; 
File.WriteAllBytes(path, certificate.Export(X509ContentType.Pkcs12)); 
+0

почему "вы должны экспортировать сертификат в PFX/PKCS # 12"? Любое понимание? Что, если это .CER? – VoodooChild

Смежные вопросы