| 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 13.04.2023(UTC) Сообщений: 42  Откуда: МоскваСказал(а) «Спасибо»: 12 раз
 | 
            
		      
                Добрый день! Так как столкнулся с темой работы с криптиопровайдером впермые то хочу понять, правильно ли я понимаю основные термины данной темы: Store (хранилище сертификатов) - какой либо физический носитель где могут храниться сертификаты. Container (контейнер) - нечто логическое в хранилище, например папка на диске где лежат сертификаты. Сертификаты - сами файлики сертификатов с ключами. От сюда несколько вопросов. Может ли в одном контейнере располагаться несколько сертификатов? Может ли несколько контейнеров, располагаться в одном хранилище? В этом коде я пытаюсь найти сертификат по отпечатку SHA1, но он ни чего не находит. До этого открываю хранилище, вроде проходит без ошибок: Код:
 hStoreHandle = Crypto.CertOpenStore(
                  Crypto.CERT_STORE_PROV_SYSTEM,
                  0,
                  IntPtr.Zero,
                  Crypto.CERT_SYSTEM_STORE_CURRENT_USER,
                  Crypto.CERT_PERSONAL_STORE_NAME
                  //Crypto.CONTAINER
                );
                if (hStoreHandle == IntPtr.Zero)
                {
                    throw new Exception("CertOpenStore error", new Win32Exception(Marshal.GetLastWin32Error()));
                }
                // Get a pointer to the signer's certificate.
                // This certificate must have access to the signer's private key.
                pSignerCert = Crypto.CertFindCertificateInStore(
                  hStoreHandle,
                  Crypto.MY_TYPE,
                  0,
                  Crypto.CERT_FIND_SHA1_HASH,
                    //sSignerName,
                  Crypto.CERT_PERSONAL_SHA1,
                  IntPtr.Zero
                );
                if (pSignerCert == IntPtr.Zero)
                {
                    throw new Exception("CertFindCertificateInStore error", new Win32Exception(Marshal.GetLastWin32Error()));
                }
 что я делаю не так? До этого определяю ОС под которой запускается прога и импортиру либы: Код:
[DllImport("libcades", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CertFindCertificateInStore(
      IntPtr hCertStore,
      Int32 dwCertEncodingType,
      Int32 dwFindFlags,
      Int32 dwFindType,
      String pvFindPara,
      IntPtr pPrevCertContext
    );
 И еще вопрос, можно с помощью ваших либ получить список стораджов и контейнеров? И чем отличаются либы libcades.so и libxades.so ? Отредактировано пользователем 13 апреля 2023 г. 16:36:37(UTC)
 | Причина: дополнительные вопросы | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Участник
 Группы: Участники
Зарегистрирован: 08.10.2018(UTC)
 Сообщений: 17
 
 Сказал(а) «Спасибо»: 1 разПоблагодарили: 1 раз в 1 постах
 
 | 
            
		      
                ЕМНИП, в хранилище может быть несколько контейнеров, но сертификаты в контейнер кладут по одному.По крайней мере я не видел, чтобы это было как-то иначе.
 | 
    | 
              1 пользователь поблагодарил AnrDaemon за этот пост. |  | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 |  | 
|  | 
    | 
              1 пользователь поблагодарил Андрей * за этот пост. |  | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 13.04.2023(UTC) Сообщений: 42  Откуда: МоскваСказал(а) «Спасибо»: 12 раз
 | 
            
		      
                Автор: Андрей *  https://github.com/CryptoPro/libcore Спасибо. Пошел курить мануал. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 13.04.2023(UTC) Сообщений: 42  Откуда: МоскваСказал(а) «Спасибо»: 12 раз
 | 
            
		      
                Добрый день!Какой командой можно посмотреть список доступных Store ?
 | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 | 
            
		      
                Автор: CyberWatcher  Добрый день!Какой командой можно посмотреть список доступных Store ?
 ... щелкнуть на ... StoreName.My  ? | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 13.04.2023(UTC) Сообщений: 42  Откуда: МоскваСказал(а) «Спасибо»: 12 раз
 | 
            
		      
                Автор: Андрей *  Автор: CyberWatcher  Добрый день!Какой командой можно посмотреть список доступных Store ?
 ... щелкнуть на ... StoreName.My  ? Да щелкнул я по нему. Я думал, что надо указывать что-то вроде \\.\HDIMAGE\ если сертификат хранится просто на диске\ вот этот код: Код:using System.Security.Cryptography.X509Certificates;
using LibCore;
using LibCore.Security.Cryptography.X509Certificates;
namespace CryptoProConsoleLib;
public class Program
{
    public static void Main(string[] args)
    {
        Initializer.Initialize();
        // ready to go!
        
        using (var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser))
        {
            store.Open(OpenFlags.ReadOnly);
            var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, "0x037409F20085AF8D9847DA45A4F9F40AD0", false)[0];
            Console.WriteLine("cert = " + cert.FriendlyName);
        }
    }
}
 выдает вот такую огшибку Unhandled exception. System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')    at System.Collections.CollectionBase.System.Collections.IList.get_Item(Int32 index)    at System.Security.Cryptography.X509Certificates.X509CertificateCollection.get_Item(Int32 index)    at System.Security.Cryptography.X509Certificates.X509Certificate2Collection.get_Item(Int32 index)    at CryptoProConsoleLib.Program.Main(String[] args) in /home/itpro/Projects/SelfEdu/DotNet/CryptoProLibConsole/CryptoProConsoleTests/Program.cs:line 17 Отредактировано пользователем 14 апреля 2023 г. 13:54:56(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 13.04.2023(UTC) Сообщений: 42  Откуда: МоскваСказал(а) «Спасибо»: 12 раз
 | 
            
		      
                вот этот код как я полагал должен вывести список сертификатов, но ни чего не выводит Код:using System.Security.Cryptography.X509Certificates;
using LibCore;
using LibCore.Security.Cryptography.X509Certificates;
namespace CryptoProConsoleLib;
public class Program
{
    public static void Main(string[] args)
    {
        Initializer.Initialize();
        // ready to go!
        
        using (var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser))
        {
            store.Open(OpenFlags.ReadOnly);
            var storeCerts = store.Certificates;
            foreach (var crt in storeCerts)
            {
                Console.WriteLine("crt.FriendlyName = " + crt.FriendlyName);
            }
            var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, "0x037409F20085AF8D9847DA45A4F9F40AD0", false)[0];
            Console.WriteLine("cert = " + cert.FriendlyName);
        }
    }
}
 Вывод такой: crt.FriendlyName =  Unhandled exception. System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')    at System.Collections.CollectionBase.System.Collections.IList.get_Item(Int32 index)    at System.Security.Cryptography.X509Certificates.X509CertificateCollection.get_Item(Int32 index)    at System.Security.Cryptography.X509Certificates.X509Certificate2Collection.get_Item(Int32 index)    at CryptoProConsoleLib.Program.Main(String[] args) in /home/itpro/Projects/SelfEdu/DotNet/CryptoProLibConsole/CryptoProConsoleTests/Program.cs:line 22 Через команду certmgr -list -container '\\.\HDIMAGE\blablabla' сертификаты выводятся Я поэтому и спрашивал, как посмотреть список Store через команрдную строку, так как думал что можно вместо StoreName.My передать строку содержащую пусть к стораджу сертификатов. Отредактировано пользователем 14 апреля 2023 г. 14:14:45(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 | 
            
		      
                StoreName.My - личное хранилищеStoreLocation.CurrentUser - текущего пользователя
 
 certmgr -list -container '\\.\HDIMAGE\blablabla' - вывод списка сертификатов из указанного контейнера, это другая вообще сущность.
 
 
 Итого:
 а сертификат установлен в хранилище?
 
 
 
 certmgr -list -cert -store uMy
 показывает?
 | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 | 
            
		      
                а зачем  обращение к [0] ?  если нет сертификата с указанным номером - будет ошибка, что и показано выше. Цитата: foreach (var crt in storeCerts){
 Console.WriteLine("crt.FriendlyName = " + crt.FriendlyName);
 }
 var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, "0x037409F20085AF8D9847DA45A4F9F40AD0", false)[0];
 Console.WriteLine("cert = " + cert.FriendlyName);
 | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
	                           
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close