OpenSSL ERR_GET_LIB数值是人类可以理解的线索

时间:2012-07-11 11:37:37

标签: openssl porting openwrt

我将用C编写的项目移植到OpenWRT mipsel系统上。交叉编译和库链接都很好,项目在mipsel系统上构建和运行,但是OpenSSL存在运行时问题。

似乎PKCS12_create因某些未知原因而失败。这是我用ERR_print_errors_fp找到的:

23502:error:06074079:lib(6):func(116):reason(121):NA:0:TYPE=pbeWithSHA1And40BitRC2-CBC
23502:error:23077073:lib(35):func(119):reason(115):NA:0:
23502:error:2306C067:lib(35):func(108):reason(103):NA:0:
23502:error:23073067:lib(35):func(115):reason(103):NA:0:

这正是OpenSSL GET_ERR_LIB应该给出的。但是,我如何找出什么是lib 35,功能119和原因115?

我使用OpenWRT SDK交叉编译器并从同一SDK链接库(包括OpenSSL)。

以下是我用来获取上述错误的基本代码:

PKCS12 *pkcs12 = NULL;
EVP_PKEY *pkey = EVP_PKEY_new();
X509 *cert = X509_new();

...

pkcs12 = PKCS12_create(password, username, pkey, cert, NULL,
                       0, 0, 0, PKCS12_DEFAULT_ITER, 0);
ERR_print_errors_fp(stderr);

if (pkcs12 == NULL){
    printf("pkcs12 == NULL\n");
    /* And here we bail out... */
}

代码可以在x86系统上运行并经过充分测试。

所以我的问题是:我如何找出lib,func和reason数值实际代表什么?

2 个答案:

答案 0 :(得分:1)

请通过启用编译时宏OPENSSL_NO_ERR来检查您的OpenSSL库是否已编译。此宏如果启用,将从OpenSSL库中删除所有错误字符串。如果你禁用这个宏,那么你应该得到人类可读的字符串。

此外,您可以检查err.h(对于与lib代码相关的宏)和ssl.h(对于函数和原因代码相关的宏),以便从这些错误中获得一些含义。

答案 1 :(得分:0)

虽然我明白,这是一个非常古老的帖子,但认为它可能对某人有所帮助。 我在调用pkcs12_create函数时遇到了同样的问题。事实证明,我没有调用OpenSSL_add_all_algorithms();在调用create函数之前。