Поддержка OpenSSL PCKS12 не работает? - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблемы с добавлением поддержки PCKS # 12 в клиентское приложение, использующее OpenSSL, в том, что тип не может быть найден, хотя заголовок определенно включен. Также невозможно получить пример кода из OpenSSL для сборки по той же причине. Это может быть проблемой с изменениями непрозрачных структур, сделанными в OpenSSL, или может быть чем-то еще (может быть, крипто не строится с поддержкой p12?). Я надеюсь, что мне просто не хватает чего-то простого. Обратите внимание, что речь идет не об утилитах командной строки, а о программной поддержке PKCS # 12.

Контекст:

Добавление поддержки PCKS # 12 к приложению, которое в настоящее время использует OpenSSL для поддержки TLS с использованием файлов сертификатов PEM. Приложение корректно работает с файлами PEM, но наш поставщик сертификатов будет предоставлять только файлы P12. Хотя мы можем преобразовать P12 в PEM, используя системный вызов скрипта, я бы предпочел этого избежать и иметь прямую поддержку P12 в моем приложении.

Что я пробовал:

  1. Загрузка последней версии и восстановление.
  2. Исследуйте проблемы OpenSSL, документы и архивы рассылки.
  3. Переполнение стека исследований.
  4. Перемещение 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, который, кажется, работает нормально). Подробности в конце этого поста.

  1. Ошибка: PKCS12 Не определено.
  2. Вероятно, ошибки при внутреннем вызове макроса в 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
...