我已经有几天一直在努力解决 openssl 问题。
我已经在 ARM 设备上编译了 openssl,但运行时openssl s_client -connect google.com:443
连接会失败error 20: unable to get local issuer certificate
。
如果我运行该命令并指定-CAfile /etc/ssl/certs/ca-certificates.crt
连接将起作用并返回verify return code: 0 (ok)
。我进行的另一项测试是使用运行该命令-CApath /etc/ssl/certs/
,在这种情况下我仍然会得到错误 20
由于 OPENSSLDIR 是 /usr/lib/ssl,我已设法将其链接到 /etc/ssl/certs,现在在文件系统中该目录如下所示:
ls -l /usr/lib/ssl
certs -> /etc/ssl/certs
我不知道我遗漏了什么,以及如何设置 openssl 必须查找证书的目录。有人遇到过类似的问题吗?
答案1
CApath 中指定的目录必须具有特殊的结构。从OpenSSL 文档
如果 CApath 不为 NULL,则指向包含 PEM 格式的 CA 证书的目录。文件每个都包含一个 CA 证书。文件通过 CA 主题名称哈希值进行查找,因此该哈希值必须可用。如果存在多个具有相同名称哈希值的 CA 证书,则扩展名必须不同(例如 9d66eef0.0、9d66eef0.1 等)。搜索按扩展名号的顺序进行,与证书的其他属性无关。使用 c_rehash 实用程序创建必要的链接
如果我没错的话,您可以使用目录作为 CApath,如果:
- 它包含 pem 格式的文件,每个文件都包含一个权限。
- 您在其中运行 c_rehash(或手动创建适当的符号链接)。