У меня проблемы с добавлением поддержки PCKS # 12 в клиентское приложение, использующее OpenSSL, в том, что тип не может быть найден, хотя заголовок определенно включен. Также невозможно получить пример кода из OpenSSL для сборки по той же причине. Это может быть проблемой с изменениями непрозрачных структур, сделанными в OpenSSL, или может быть чем-то еще (может быть, крипто не строится с поддержкой p12?). Я надеюсь, что мне просто не хватает чего-то простого. Обратите внимание, что речь идет не об утилитах командной строки, а о программной поддержке PKCS # 12.
Контекст:
Добавление поддержки PCKS # 12 к приложению, которое в настоящее время использует OpenSSL для поддержки TLS с использованием файлов сертификатов PEM. Приложение корректно работает с файлами PEM, но наш поставщик сертификатов будет предоставлять только файлы P12. Хотя мы можем преобразовать P12 в PEM, используя системный вызов скрипта, я бы предпочел этого избежать и иметь прямую поддержку P12 в моем приложении.
Что я пробовал:
- Загрузка последней версии и восстановление.
- Исследуйте проблемы OpenSSL, документы и архивы рассылки.
- Переполнение стека исследований.
- Перемещение p12_local.h во включенную папку, чтобы я мог напрямую использовать определения структуры.
Среда
Platform: Debian Linux
IDE: Eclipse CDT
OpenSSL version: (from VERSION)
MAJOR=3
MINOR=0
PATCH=0
PRE_RELEASE_TAG=dev
BUILD_METADATA=
RELEASE_DATE=
SHLIB_VERSION=3
Issues:
Сборка сообщает о двух классах проблем при сборке клиентского приложения, использующего OpenSSL (не при сборке самого OpenSSL, который, кажется, работает нормально). Подробности в конце этого поста.
- Ошибка: PKCS12 Не определено.
- Вероятно, ошибки при внутреннем вызове макроса в OpenSSL (я не вызываю макросы).
Источник
Адаптировано из примера кода на https://github.com/openssl/openssl/blob/master/demos/pkcs12/pkread.c:
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>
#include <openssl/bio.h>
#include <openssl/x509.h>
#include <openssl/pkcs12err.h>
int main(int argc, char **argv)
{
FILE *fp;
EVP_PKEY *pkey = NULL;
X509 *cert = NULL;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12 = NULL; << error undefined
char *name = NULL;
int i, ret = EXIT_FAILURE;
Типы
PKCS12 объявлен в pkcs12.h (который находится в моем пути включения) как
typedef struct PKCS12_t PKCS12;
struct PKSC12_t определена в p12_local.h, который только #included в файлах реализации в криптографическом каталоге.
ПРИМЕЧАНИЯ
От INSTALL (https://github.com/openssl/openssl/blob/master/INSTALL) (выделение добавлено):
Компиляция существующих приложений
Начиная с версии 1.1.0, OpenSSL скрывает ряд ранее открытых структур . Это включает в себя все внутренние структуры libssl и ряд типов EVP. Функции доступа были добавлены для обеспечения контролируемого доступа к данным структур.
Это означает, что необходимо переписать некоторое программное обеспечение, чтобы приспособиться к новым способам работы. Это часто сводится к выделению экземпляра структуры в явном виде, где вы могли бы предварительно разместить их в стеке как автоматические c переменные, и с использованием предоставленных функций доступа, где вы ранее обращались бы непосредственно к полю структуры.
Некоторые API также изменились. Однако более старые API были по возможности сохранены.
ОШИБКИ СОЗДАНИЯ
Построение приводит к следующим 26 ошибкам, все, кроме двух последних отчетов как «строка 55, внешнее местоположение: /usr/local/include/openssl/pkcs12.h C / C ++ Проблема»:
invalid storage class for function ‘sk_PKCS12_SAFEBAG_deep_copy’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_delete_ptr’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_delete’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_dup’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_find_ex’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_find’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_free’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_insert’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_is_sorted’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_new_null’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_new_reserve’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_new’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_num’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_pop_free’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_pop’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_push’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_reserve’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_set_cmp_func’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_set’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_shift’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_sort’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_unshift’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_value’
invalid storage class for function ‘sk_PKCS12_SAFEBAG_zero’
make: *** [lib/epri/src/subdir.mk:152: lib/epri/src/openssl.o] Error 1
Type 'PKCS12' could not be resolved