У меня есть файл с сертификатом, и у меня есть файл с файлом закрытого ключа.
, если я запускаю эту команду
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 года, и ни один из них не является очень явным, и ни один из примеров кода не делаетименно то, что мне нужно, но я знаю, что у меня есть все кусочки, они просто не дают результата.