如何让Apache2 httpd在从Apache发出的SSL连接中使用Ubuntu的CA证书?

6
注意:这不是关于让Apache接受入站SSL连接的问题。
我有一个Apache模块需要进行出站SSL连接。当它尝试连接时,会出现以下错误:
无法发送事件:OpenSSL库报告了一个错误:错误:14090086:SSL例程:ssl3_get_server_certificate:certificate verify failed:s3_clnt.c:1269:
这表明Apache使用的SSL库不知道我的模块正在尝试连接的服务器的(有效)证书。
在我运行此系统的Ubuntu系统上的CA证书是可用的,并且了解这个下游证书,openssl s_client 告诉我一切正常。
如何告诉Apache2使用ubuntu系统的CA证书使出站连接工作?
更新-我执行了strace -e open httpd -X,以查看它尝试从哪里加载证书。我看到Apache打开了libssl.so,但我甚至没有看到它尝试打开通常的ssl.cnf或任何证书文件。
更新2:关于我如何创建https请求-我从我的自定义Apache模块内部发出请求。我的模块.so是使用Rust编写的,因此连接代码基本上如下:
在mod_mine.so中:
use hyper::Client;
use hyper_tls::HttpsConnector;
use tokio_core::reactor::Core;

let mut core = Core::new()?;
let handle = core.handle();
let client = Client::configure()
    .connector(HttpsConnector::new(4, &handle)?)
    .build(&handle);

//actually a POST, but this gets the same error
let request = client.get("https://saas.mycompany.io".parse()?);
let result = core.run(request)?;
...  //process result

您是在构建自定义模块还是使用现有的模块?您能告诉我该模块的名称吗? - Tarun Lalwani
@TarunLalwani - 这是一个自定义模块。它只是进行 HTTPS 调用。当以独立方式运行时,可以正常工作,使用 Ubuntu 的 libssl。但出于某种原因,在 Apache 内部无法工作。 - marathon
可以提供一个包含最小可重现示例的样本 git 存储库吗? - Tarun Lalwani
你是如何连接到外部URL的?你使用curl吗?你能发布一下建立连接的源代码吗? - Tarun Lalwani
1个回答

1
我找到了一个可行的解决方案,但不确定它是否最优。
openSSL使用环境变量SSL_CERT_FILE。我可以在我的Apache模块源代码中设置这个变量。
use std::env;
let cert_file = figure_out_cert_path();  //on ubuntu:  /etc/ssl/certs/ca-certificates.crt
env::set_var("SSL_CERT_FILE", cert_file);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接