【问题标题】:Openssl: certificate verification fails when CApath argument is used in SSL_CTX_load_verify_locations APIOpenssl:在 SSL_CTX_load_verify_locations API 中使用 CApath 参数时证书验证失败
【发布时间】:2015-11-30 11:50:53
【问题描述】:

我正在尝试建立与服务器计算机的 TLS 连接。我已经使用 openssl CLI 命令创建了根 CA 证书和服务器证书。我创建了通用名称与其 IP 地址相同的服务器证书。根 CA 证书的通用名称是服务器的 FQDN。

我正在使用 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 文件的目录的路径,将 CAfile 参数保留为 NULL,则由于证书验证错误,连接失败。

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

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

谁能告诉我这个问题的原因,如果可能的话,有解决办法吗?

【问题讨论】:

  • CApath 中的文件是否具有文档中描述的正确文件名(即证书哈希)?来自openssl.org/docs/manmaster/ssl/…:“如果 CApath 不为 NULL,它指向包含 PEM 格式的 CA 证书的目录。每个文件都包含一个 CA 证书。这些文件通过 CA 主题名称哈希值查找,因此必须可用……”
  • CA 证书具有主题名称(CN=)。但我不明白主题名称哈希是什么意思。我在证书中没有看到这样的字段。
  • 您的评论显示您的文件可能没有正确的名称。您可以阅读mta.openssl.org/pipermail/openssl-users/2015-July/001687.html 了解有关如何创建正确文件名的更多信息。
  • @SteffenUllrich 这真的很有帮助。谢谢

标签: c ssl openssl x509 tls1.2


【解决方案1】:

我正在发布我自己问题的答案,因为我没有从互联网上获得太多关于这个问题的信息,所以我花了很多时间来寻找解决这个问题的方法。我希望这能帮助其他面临类似问题的人。

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

可以将 CA 文件重命名为其主题名称哈希值,或者可以使用与 CA 文件的 CA 主题名称哈希相同的名称创建指向 CA 文件的软链接。

c_rehash 实用程序可用于在 CApath 中创建必要的链接。这个命令的语法很简单。

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 文件。

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 2015-10-19
    • 2021-07-30
    • 2023-03-31
    • 2011-08-29
    • 2011-12-27
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多