openssl - OpenSSL PCKS12 支持被破坏了吗?
问题描述
我在使用 OpenSSL 向客户端应用程序添加 PCKS#12 支持时遇到了问题,尽管肯定包含了标头,但无法找到该类型。出于同样的原因,也无法从 OpenSSL 获取示例代码来构建。这可能是在 OpenSSL 中进行的不透明结构更改的问题,或者可能是其他问题(也许加密不是在 p12 支持下构建的?)。我希望我只是缺少一些简单的东西。请注意,这不是关于命令行实用程序,而是关于以编程方式支持 PKCS#12。
语境:
将 PCKS#12 支持添加到当前使用 OpenSSL 以支持使用 PEM 证书文件的 TLS 的应用程序。该应用程序与 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
问题:
该构建报告了使用 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 中,它只在 crypto 目录的实现文件中#included。
笔记
从安装(https://github.com/openssl/openssl/blob/master/INSTALL)(强调添加):
编译现有应用程序
从版本 1.1.0 开始,OpenSSL 隐藏了许多以前 open 的结构。这包括所有内部 libssl 结构和许多 EVP 类型。添加了访问器函数以允许对结构数据的受控访问。
这意味着需要重写一些软件以适应新的做事方式。这通常相当于显式分配结构的实例,您可以在之前将它们作为自动变量分配到堆栈上,并使用提供的访问器函数,您之前可以直接访问结构的字段。
一些 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