【发布时间】: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 这真的很有帮助。谢谢