Установка понятного имени сертификата - PullRequest
3 голосов
/ 10 сентября 2009

Я пытаюсь установить дружественное имя сертификата во время процесса запроса / принятия сертификата. Я понимаю, что это свойство магазина Microsoft, а не сертификат, и интересно, какой метод .net / c # может быть использован для его установки.

Ответы [ 3 ]

1 голос
/ 25 апреля 2010

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

X509Certificate2 certificate = new X509Certificate2(...);
certificate.FriendlyName = "MyName";
File.WriteAllBytes(path, certificate.Export(X509ContentType.Pkcs12));
1 голос
/ 11 сентября 2009

Итак, вот пример командной строки, как это сделать. Вам нужен 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 голосов
/ 21 февраля 2010

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

Привет

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

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

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

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

Временное решение:

Возможный обходной путь - изменить платформу вашего проекта с «Любой ЦП» на «X86» (в Свойствах проекта, Цель сборки / Платформы)

ROOTCAUSE

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...