Как я могу добавить закрытый ключ к сертификату в хранилище доверия Windows в C ++? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть файл с сертификатом, и у меня есть файл с файлом закрытого ключа.

, если я запускаю эту команду

certutil –MergePFX certfile.cer certfile.pfx

Я получаю файл pfx, который, если я запускаю с проводником, запускает мастер импорта сертификатов Windows.Если я бегу через мастера, я получаю сертификат с ключом в хранилище доверенных сертификатов Windows.Именно то, что мне нужно.

Я пытаюсь сделать это программно.

Кажется, проблема в функции CertAddCertificateContextToStore.В комментариях говорится:

Контекст сертификата не дублируется с использованием CertDuplicateCertificateContext.Вместо этого функция создает новую копию контекста и добавляет ее в хранилище.В дополнение к закодированному сертификату CertDuplicateCertificateContext также копирует свойства контекста, за исключением свойств CERT_KEY_PROV_HANDLE_PROP_ID и CERT_KEY_CONTEXT_PROP_ID.

Так что certduplicatecertificateCateContateTetCateContinState копирует, также не подозревает, что CertTateCateContinTatCateTNT не проверяет ещелибо.

У меня есть структура HCRYPTPROV с моим закрытым ключом, и я использую CERT_KEY_CONTEXT_PROP_ID и CERT_KEY_PROV_HANDLE_PROP_ID (я попробовал их обоих), чтобы CertSetCertificateContextProperty доверяю мой сертификат, сохраняю его в сертификате, а затем сохраняю его в сертификате.И независимо от того, что я пытаюсь, сертификат идет без закрытого ключа.

Я проверяю это с помощью инструмента certmgr, который показывает, подключен ли закрытый ключ, и я также вижу, что он не работает, когда яиспользуйте этот клиентский сертификат в запросе curl, который я делаю.

Еще одна вещь, которую я попробовал, заключалась в следующем:

Последний параметр CertAddCertificateContextToStore - дескриптор копии созданного контекста.Я полагаю, что исходный контекст - это тот, который я создал, где я читаю сертификат с диска.Этот новый сертификат привязан к фактическому хранилищу на диске, которое читает certmgr.

Поэтому после вызова CertAddCertificateContextToStore я беру новый сертификат и добавляю закрытый ключ, снова через CertSetCertificateContextProperty, а затем навсегдамера, я вызываю CertControlStore, чтобы выдвинуть версию контекста в памяти на диск.По-прежнему никакого эффекта.Каждый вызов функции завершается успешно, но закрытый ключ никогда не попадает в хранилище доверия Windows.

Короче говоря, мой вопрос в том, что делает инструмент импорта сертификатов Windows, а я не могу сохранитьзакрытый ключ вместе с сертификатом в хранилище доверенных сертификатов Windows?

Я нашел несколько других вопросов, примеров программ и досок объявлений, начиная с 2002 года, и ни один из них не является очень явным, и ни один из примеров кода не делаетименно то, что мне нужно, но я знаю, что у меня есть все кусочки, они просто не дают результата.

1 Ответ

0 голосов
/ 19 сентября 2018

Я твердо верю, что вы установили неверные свойства.Вы должны установить только свойство контекста CERT_KEY_PROV_INFO_PROP_ID в вызове CertSetCertificateContextProperty, чтобы связать сертификат с закрытым ключом.

Если у вас есть дескриптор HCRYPTPROV, то у вас есть вся необходимая информация для построения структуры CRYPT_KEY_PROV_INFO.

...