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.