2015-09-04 660 views
2

我正在尝试建立到服务器计算机的TLS连接。我使用openssl CLI命令创建了根CA证书和服务器证书。我创建了具有与其IP地址相同的通用名称的服务器证书。根CA证书的通用名称是服务器的FQDN。Openssl:在SSL_CTX_load_verify_locations中使用CApath参数时,证书验证失败API

我正在使用openssl库API建立与服务器的连接。 我现在用的是API

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath)

用于设置CA文件查找路径。

当我使用CAfile参数指定我的CA文件的路径并将CApath参数保留为NULL时,一切正常。

但是,如果我用CApath参数指定的路径到包含CA文件的目录,留下凭证档案错误参数为NULL,则连接由于证书验证错误失败。

当我使用wireshark捕获数据包时,发现我的客户端代码正在从服务器发送“服务器问候”的TLS响应“未知CA”。我已经使用了我在成功连接中使用的相同CA证书文件。

从我的观察,同时探索OpenSSL库的源代码,我推断,在我的情况下,CA的文件不被认为是由库API有效,因此没有被加载由于一些未知的原因。

有人可以告诉我的原因,如果可能的话,这个问题的解决方案?

+3

如文档中所述,CApath中的文件是否具有正确的文件名称(即证书散列)?从https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_load_verify_locations.html:“如果CApath不是NULL,它指向一个包含PEM格式CA证书的目录,每个文件都包含一个CA证书,文件由CA主题名称哈希值查找,因此必须可用...“ –

+0

CA证书具有主题名称(CN = )。但我不明白什么是主题名称散列。我在证书中看不到这样的字段。 – sreeyesh

+3

您的评论显示您的文件可能没有正确的名称。您可以阅读https://mta.openssl.org/pipermail/openssl-users/2015-July/001687.html以获取有关如何创建正确文件名的更多信息。 –

回答

3

我张贴的答案我自己的问题,因为我花了很多时间寻找这个问题的解决方案,因为我没有得到关于从互联网这个问题太多信息。我希望这会帮助其他面临类似问题的人。

如果CApath不为空,则CApath指向的目录应包含有效的CA证书。最重要的是CA文件名应该是主题名称哈希值。

无论是CA的文件进行重命名,它们的主题名称的哈希值或软链接到可与名称相同CA文件的CA主题名散创建的CA文件。

c_rehash实用程序可用于在CApath中创建必要的链接。这相当sipmle的语法。

c_rehash <CApath> 

c_rehash实用程序可能不适用于所有的Linux发行版。在这种情况下,

openssl x509 -in <CA file name> -noout -subject_hash 

可用于生成主题名称散列(例如e5d93f80)。只需将“.0”附加到该值,然后使用该名称(e5d93f80.0)创建一个到CA文件的软链接。如果有多个CA文件具有相同的主题名称散列值,则它们的扩展名应该不同(例如,e5d93f80.1)。搜索按分机号码的顺序执行。

opensssl已经引入了这种技术来减少CA文件查找时间。否则,openssl可能必须读取CApath中的所有文件才能找到匹配的CA文件。

+0

这非常有帮助。谢谢@sreeyesh –

相关问题