CertCreateCertificateContext возвращает ASN1 встреченное значение неверного тега

Я загружаю файл сертификата.p7b в память, а затем вызываю для него CertCreateCertificateContext, но он завершается неудачно с ошибкой "встретилось неверное значение тега ASN1".

Звонок выглядит так:

m_hContext = CertCreateCertificateContext (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbCertEncoded, dwCertEncodedLen);

Это возвращает NULL и GetLastError() возвращает ошибку, упомянутую выше.

Я создал файл сертификата, перетаскивая сертификат из настроек в IE, который затем выполняет автоматический экспорт в файл.

Что я делаю неправильно?

Спасибо!

3 ответа

Решение

Попробуйте открыть свой сертификат каким-нибудь редактором asn.1.

Возможно, ваш сертификат был экспортирован неправильно или размер сертификата, который вы передаете API, неправильный... Скорее второй вариант (неправильная конструкция сертификата или передача).

Я нашел здесь информацию о том, что кодировка, которую вы пытаетесь использовать, не полностью поддерживается (см. Возможные значения ошибок).

Вы должны использовать CertOpenStore() вместо:

HCERTSTORE hCertStore = CertOpenStore(
    CERT_STORE_PROV_FILENAME,
    X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
    NULL,
    CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,
    pszFilePath));

CertCreateCertificateContext() поддерживает только один сертификат, тогда как файл PKCS #7 может содержать много.

Цитата из MSDN:

CERT_STORE_PROV_FILENAME Инициализирует хранилище с сертификатами, CRL и CTL из файла. Поставщик открывает файл и сначала пытается прочитать файл как сериализованное хранилище, затем как подписанное сообщение PKCS #7 и, наконец, как один закодированный сертификат.

После открытия хранилища сертификатов вы можете использовать CertEnumCertificatesInStore() получить контекст сертификата отдельных сертификатов из хранилища.

Убедитесь, что сертификат в двоичном формате.

У меня была похожая проблема, когда сертификат был в кодировке Base-64 X.509. Это было исправлено, когда я использовал тот же сертификат в двоичном коде DER X.509

Вы можете легко сделать это в Windows, вручную импортировав в хранилище сертификатов, а затем экспортировав в нужном формате.

Затем сертификат можно использовать для установки на другие машины с использованием функций winapi.

Другие вопросы по тегам