Генерация pfx с помощью OpenSSL api

#openssl #pkcs#12

#openssl #pkcs #12

Вопрос:

Я пытаюсь экспортировать сертификат и закрытый ключ в виде файла pfx с помощью OpenSSL api.

Для этого я вызываю функцию PKCS12_create с значением -1 для nid_key и nid_cert (не шифровать ключ и сертификат) и 0 для iter, mac_iter и keytype (использовать значения по умолчанию).

Результатом этого вызова функции (плюс очевидный вызов i2d_PKCS12_bio) является файл в кодировке der, который можно просмотреть в декодере asn1.

Однако информация из этого файла не может быть импортирована ни в одно хранилище сертификатов Windows или Firefox. Windows отвечает «Произошла внутренняя ошибка. Либо профиль пользователя недоступен, либо для импортируемого вами закрытого ключа может потребоваться поставщик криптографических услуг, который не установлен в вашей системе «. и Firefox отвечает «Сбой операции PKCS # 12 по неизвестным причинам». Дело в том, что пароль интерпретируется правильно.

Итак, что мне нужно сделать, чтобы сгенерировать файл pfx, который операционная система или Firefox примут в свои хранилища?

Редактировать

Еще немного информации о том, что я на самом деле делаю.

Для использования OpenSSL api из C # я использую оболочку ManagedOpenSsl. Я добавил поддержку ключей EC в эту оболочку, и я могу генерировать ключи и подписывать сертификаты с помощью этих ключей. Эти сертификаты правильно отображаются системой.

Я создал два файла pfx, первый с помощью инструмента командной строки OpenSSL, второй с помощью моего кода. Единственное различие в форме файлов — это дополнительное целое число в конце первого файла, сгенерированного командной строкой. Итак, есть ли какие-либо особые требования к содержимому сертификата или форме ключа, которых мне не хватает?

Комментарии:

1. Трудно сказать, что может быть не так без какого-либо кода. Но вы могли бы посмотреть на использование OpenSSL этой функции в <openssl src>/apps/pkcs12.c . Это исходный код для pkcs12 утилиты.

Ответ №1:

После того, как я два дня рвал на себе волосы, я обнаружил проблему.

Работая на немецком рынке, одним из требований к нашему программному обеспечению является использование кривых Brainpool. Операционная система Windows их не знает. Firefox их не знает. OpenSSL знает их только в бета-версии 1.0.2. Если я создам сертификат NIST и ключ и объединю их в pfx-файл, все будет работать нормально.