我在非 *nix/Windows/Mac 平台上遇到 Openssl 问题。
Windows 上与我的平台上相同的 C 代码(除了一些使其在 Windows 上运行的调整外,SSL 逻辑是相同的)可以完美运行。服务器和客户端可以相互验证。 但是在我的平台上,客户端不对服务器进行身份验证。服务器证书无效,即使它在客户端运行在 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。
最佳答案
它们是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
是的,他们确实在#including
定义之前将函数名#define
到其他名称,这样编译器永远不会看到任何符号LP_find_file
和 LP_find_file_end
。就预处理器之后的任何事情而言,它们将被称为 OPENSSL_DIR_read
和 OPENSSL_DIR_end
。
OPENSSL_DIR_read
在 SSL_add_dir_cert_subjects_to_stack
中使用,因此您的问题可能与此有关。
这些功能也不是非常复杂,重新实现起来应该相当简单。 LP_find_file
(嗯,OPENSSL_DIR_read
)在第一次调用时打开目录上下文(即,使用空指针的地址)并返回描述上下文的内容和第一个目录中的文件名,从第二次调用开始,仅步进到下一个文件名,直到不再有文件名,然后返回 NULL
。 LP_find_file_end
/OPENSSL_DIR_end
只是关闭上下文。我不知道您在哪个平台上工作,但如果其 API 中没有可以轻松映射到此平台的函数,我会感到惊讶。
关于c - LPdir 未实现,它是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28295561/