首页 > 解决方案 > OpenSSL PCKS12 支持被破坏了吗?

问题描述

我在使用 OpenSSL 向客户端应用程序添加 PCKS#12 支持时遇到了问题,尽管肯定包含了标头,但无法找到该类型。出于同样的原因,也无法从 OpenSSL 获取示例代码来构建。这可能是在 OpenSSL 中进行的不透明结构更改的问题,或者可能是其他问题(也许加密不是在 p12 支持下构建的?)。我希望我只是缺少一些简单的东西。请注意,这不是关于命令行实用程序,而是关于以编程方式支持 PKCS#12。

语境:

将 PCKS#12 支持添加到当前使用 OpenSSL 以支持使用 PEM 证书文件的 TLS 的应用程序。该应用程序与 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

问题:

该构建报告了使用 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 中,它只在 crypto 目录的实现文件中#included。

笔记

从安装(https://github.com/openssl/openssl/blob/master/INSTALL)(强调添加):

构建错误

构建导致以下 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

标签: opensslpkcs#12

解决方案


推荐阅读