2011-02-01 5 views
4

У меня есть структура CERT_CONTEXT, которую я извлек из смарт-карты в Windows через CryptoAPI. Мне нужно преобразовать эту структуру в массив закодированных байтов DER, который согласуется с OpenSSL. Самое близкое совпадение, которое я получил до сих пор, - это CryptEncodeObject с использованием X509_ASN_ENCODING и модификатора X509_CERT_TO_BE_SIGNED, который принимает структуру CERT_INFO в качестве входных данных.Преобразование между форматами Windows CryptoAPI и OpenSSL x509

Проблема в том, что она не совпадает с выходом, производимым функцией OpenSSL i2d_X509. Используя сертификат 2048 бит x509 в качестве входных данных, OpenSSL производит 1789 байт кодированного вывода, тогда как Windows CryptoAPI создает 1638 байт кодированного вывода.

Единственный вариант, который я вижу, - это создать сертификат X509 на лету, используя значения из структуры CERT_CONTEXT и закодировать результирующий объект непосредственно с помощью функции i2d_X509. Единственная проблема заключается в том, что я не могу извлечь закрытый ключ из смарт-карты, так что это может вызвать проблемы с процедурами создания сертификатов x509.

Если кто-либо может предоставить какие-либо идеи/советы/советы по этим вопросам, я был бы очень обязан.

ответ

6

Сертификат, закодированный DER, может быть получен из (ctx-> pbCertEncoded, ctx-> cbCertEncoded) буфера, где ctx является объектом PCCERT_CONTEXT. Тем не менее вы не сможете восстановить закрытый ключ.

+0

Argh !, прямо передо мной все время :), спасибо, я бы никогда не нашел это в противном случае, я решил, что использую функцию CryptEncodeObject. Мне не нужен секретный ключ, я использую кодировку открытого ключа в качестве исходных данных для операции подписи. –

Смежные вопросы