Преобразование из PKCS #7 в DER с помощью CryptoAPI

Подскажите, пожалуйста, как выполнить преобразование сертификата PKCS #7 (возвращён CA в ответ на запрос) в DER (чтобы быть помещённым в контейнер к заранее сгенерённой ключевой паре).

CryptDecodeObject() и
CertCreateCertificateContext()

возвращают #define CRYPT_E_ASN1_BADTAG (0x8009310BL)
(вероятно, они ждут не PKCS #7)

При этом:
1. Сохранённый вручную в *.p7b файл прекрасно распознаётся оснастками Windows.
2. Утилиты dumpasn1.exe и certutil.exe подтверждают правильность сертификата.

Ещё раз задача: поместить сертификат в контейнер.

Re: Преобразование из PKCS #7 в DER с помощью CryptoAPI

Решение найдено.

Поскольку PKCS #7 - это формат хранилища, но нужно использовать функции хранилища: CertOpenStore().
Затем можно перечислить сертификаты в хранилище (CertEnumCertificatesInStore) или найти нужный по параметрам (CertFindCertificateInStore).

В моём случае в хранилище оказалась цепочка из двух сертификатов.

Re: Преобразование из PKCS #7 в DER с помощью CryptoAPI

Все правильно, можно использовать для этих целей CertOpenStore с параметром lpszStoreProvider либо CERT_STORE_PROV_FILE, либо CERT_STORE_PROV_FILENAME.
Дальше работа с этим хранилищем идет работа как с любым другим хранилищем сертификатов.

О импорте сертификатов в хранилище:
https://forum.rutoken.ru/viewtopic.php?pid=7
https://forum.rutoken.ru/viewtopic.php?id=22

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"