我在非* nix / Windows / Mac平台上遇到Openssl问题。
同样的C代码(除了一些调整使它在Windows上运行,SSL逻辑是相同的)在Windows上和在我的平台上完美配合。服务器和客户端可以相互验证。 但是在我的平台上,客户端不会对服务器进行身份验证。即使在WIndows上运行客户端时,服务器证书也无效。 我还通过CA和证书所在的命令行对openssl进行了双重检查。所以这是我平台上的一个问题。
当我在我的平台上编译时,我有一些警告,这可能与此有关。
一个是LPDIR_H。我有LPdir_nyi.h(尚未实现)。此文件中的函数查找文件(LP_find_file)并查找文件的END(LP_find_file_end)。也许这就是问题所在。
这些文件何时使用?我找不到这些功能的明显调用,所以我不知道它们是否被openssl使用?
编辑: 我应该补充说,函数SSL_CTX_load_verify_locations正确返回。调查是否由它调用SSL_add_dir_cert_subjects_to_stack。
答案 0 :(得分:1)
它们是OPENSSL_DIR_read
和OPENSSL_DIR_end
的实现。来自crypto/o_dir.c
:
/* The routines really come from the Levitte Programming, so to make
life simple, let's just use the raw files and hack the symbols to
fit our namespace. */
#define LP_DIR_CTX OPENSSL_DIR_CTX
#define LP_dir_context_st OPENSSL_dir_context_st
#define LP_find_file OPENSSL_DIR_read
#define LP_find_file_end OPENSSL_DIR_end
#include "o_dir.h"
#define LPDIR_H
#if defined OPENSSL_SYS_UNIX || defined DJGPP
#include "LPdir_unix.c"
#elif defined OPENSSL_SYS_VMS
#include "LPdir_vms.c"
#elif defined OPENSSL_SYS_WIN32
#include "LPdir_win32.c"
#elif defined OPENSSL_SYS_WINCE
#include "LPdir_wince.c"
#else
#include "LPdir_nyi.c"
#endif
是的,他们确实#define
函数在#including
定义之前命名为其他名称,因此编译器永远不会看到任何符号LP_find_file
和LP_find_file_end
。就预处理器之后的任何内容而言,它们将被称为OPENSSL_DIR_read
和OPENSSL_DIR_end
。
OPENSSL_DIR_read
中使用了{p> SSL_add_dir_cert_subjects_to_stack
,因此您的问题可能与此相关似乎是合理的。
这些功能也不是非常复杂,重新实现起来应该相当简单。 LP_find_file
(好,OPENSSL_DIR_read
)在第一次调用目录上下文时(即使用空指针的地址)打开目录上下文,并返回描述上下文和目录中第一个文件名的内容,从第二次调用开始,只需步骤到下一个文件名,直到不再有,然后返回NULL
。 LP_find_file_end
/ OPENSSL_DIR_end
只关闭上下文。我不知道你正在做什么平台,但如果它的API中没有可以很容易映射到这个功能的函数,我会感到惊讶。