Как сохранить выбранный сертификат?
От: rayluke Россия  
Дата: 20.09.04 13:54
Оценка:
Добрый день!

Как сохранить выбранный сертификат в CAPICOM, не в смысле на диск, а получить идентификатор
с тем, чтобы потом получать его из Store по идентификатору?

Или же все умные программы типа Outlook сохраняют сертификаты на диск?

Вот пример кода:
        public void selectCertificateButton_Click( object o, System.EventArgs a) 
        {
            CAPICOM.StoreClass store = new CAPICOM.StoreClass();
            store.Open(
                CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE,
                "My",
                CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY |
                CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY
            );
            try 
            {
                CAPICOM.ICertificates selectedCertificates = ((CAPICOM.ICertificates2)store.Certificates).Select(
                    @"Выберите сертификат",
                    @"Выберите сертификат для использования.",
                    false
                    );
                CAPICOM.ICertificate2 selectedCertificate = (CAPICOM.ICertificate2) selectedCertificates[1];
                if(selectedCertificate.HasPrivateKey() == false) 
                {
                    System.Windows.Forms.MessageBox.Show(
                        @"Этот сертификат не имеет ассоциированного с собой закрытого ключа",
                        @"Ошибка выбора сертификата", 
                        System.Windows.Forms.MessageBoxButtons.OK, 
                        System.Windows.Forms.MessageBoxIcon.Stop
                    );
                    return;
                } else if (selectedCertificate.PublicKey().Algorithm.FriendlyName != "RSA") 
                {
                    System.Windows.Forms.MessageBox.Show(
                        @"Ключ, ассоциированный с этим сертификатом не является RSA ключом",
                        @"Неподходящий сертификат",
                        System.Windows.Forms.MessageBoxButtons.OK,
                        System.Windows.Forms.MessageBoxIcon.Stop
                    );            
                    return;
                }
                // КАК ЕГО СОХРАНИТЬ ТО???
            } 
            catch(System.Exception) 
            {
                System.Windows.Forms.MessageBox.Show(
                    @"Не удалось получить закрытый ключ. Вы выбрали сертификат?",
                    @"Ошибка выбора сертификата",
                    System.Windows.Forms.MessageBoxButtons.OK,
                    System.Windows.Forms.MessageBoxIcon.Stop
                );
            }

        }


С уважением,
Иван Рэйлюков
Re: Иными словами, что есть ID в CAPICOM.ICertificate2,
От: rayluke Россия  
Дата: 20.09.04 14:03
Оценка:
Иными словами, что есть уникальный идентификатор в CAPICOM.ICertificate2 ?
Re[2]: Идентификатор сертификата
От: rayluke Россия  
Дата: 22.09.04 17:16
Оценка:
Имя издателя (IssuerName) и серийный номер (SerialNumber) сертификата совместно являются уникальным идентификатором сертификата.
Re: Как сохранить выбранный сертификат?
От: hd44780 Украина http:\\hd44780.yandex.ru
Дата: 31.03.05 05:31
Оценка:
Здравствуйте, rayluke, Вы писали:

R>Добрый день!


R>Как сохранить выбранный сертификат в CAPICOM, не в смысле на диск, а получить идентификатор

R>с тем, чтобы потом получать его из Store по идентификатору?

R>Или же все умные программы типа Outlook сохраняют сертификаты на диск?


Сохранять можно двумя вариантами: с закрытым ключом и паролем и без них.
Пример
Certificate сert = .... // сертификат

if ( password == null || password == "" )
{ // пароля не указан — экспорт без закрытого ключа (файл .cer)
cert.Save ( filename, "",
CAPICOM_CERTIFICATE_SAVE_AS_TYPE.CAPICOM_CERTIFICATE_SAVE_AS_CER,
CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY );
} // if
else
{ // пароль указан (файл типа .pfx)
cert.Save ( filename, password,
CAPICOM_CERTIFICATE_SAVE_AS_TYPE.CAPICOM_CERTIFICATE_SAVE_AS_PFX,
CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN);
} // else

Правда не проверял, что будет если попытаться записать сертификат без закрытого ключа как сертификат с ключом.
Но наличие ключа можно проверить заранее:
bool isPrivateKeyPresent = cert.HasPrivateKey ( ); // true — есть ключ, false — нет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.