我正在配置 rsyslog 以通过 TCP/TLS 转发。我很好奇为什么与 HTTPS 不同,我必须将证书添加到我的客户端,所以我违反了 README 并注释掉了证书配置,只剩下以下内容:
# global(DefaultNetstreamDriverCAFile="/etc/ssl/cert.pem")
ruleset(name="fluentd") {
action(
type="omfwd"
target="<my domain>"
port="24224"
protocol="tcp"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="anon"
)
}
Warning: CA certificate is not set [v8.2001.0 try https://www.rsyslog.com/e/2329 ]
现在,我在 rsyslog 日志中得到了日志消息仍然成功转发到我的 fluentd 实例,它使用 TLS。
这是为什么?这个证书有必要吗?
答案1
根据您的评论,我只是一般性地回答,因为我们无法讨论实际安装的具体细节。
当基于 Linux 的程序(例如 rsyslog)使用 TLS 时,该程序通常使用标准 TLS 库(例如 OpenSSL 或 GnuTLS)构建(链接到)。这些库访问证书存储区(文件、文件目录或数据库)、在存储区中找到适当的证书、构建证书链并执行服务器证书验证(借助底层加密和其他库)。
诸如这样的语句DefaultNetstreamDriverCAFile="/etc/ssl/cert.pem"
将所需证书存储(文件)的路径传递给该 TLS 库(一个系统可以有多个证书存储)。因此,当您没有注释掉该行时,rsyslog 会告诉 TLS 库使用该文本文件,其中包含一个或多个 PEM 格式的证书。
如果注释掉该行,则发生的情况取决于底层 TLS 库。如果库是使用默认证书存储构建的,则库仍然可以执行 TLS 协商。例如,在我的 Ubuntu 20 机器上,使用 GnuTLS 库的程序将链接到/usr/lib/x86_68-linux-gnu/libgnutls.so
。该共享对象库文件是使用默认证书存储路径编译的/etc/ssl/certs/ca-certificates.crt
——文本文件证书存储,这是 Ubuntu 操作系统的标准位置。如果运行以下命令,您可以看到此硬编码路径:
strings /usr/lib/x86_68-linux-gnu/libgnutls.so | grep certificates
。
因此,如果我使用相同的注释掉的 DefaultNetstreamDriverCAFile 行运行链接到 GnuTLS 的 rsyslog,则将使用证书存储的硬编码路径,并且 rsyslog 可以完成 TLS 协商。
这很可能就是您的系统上发生的情况,也是您看到的消息仅为“警告”级别的原因。rsyslog 程序不知道底层 TLS 库是否有默认值,因此编写 rsyslog 是为了警告您并继续。如果底层 TLS 库没有可用的证书存储,则该代码将向 rsyslog 返回致命错误消息,然后 rsyslog 将向用户转发/记录该消息。
答案2
此设置StreamDriverAuthMode="anon"
使证书颁发机构存储与此连接无关,这就是为什么这只是一个警告。无论服务器是否提供有效证书,您都将连接到该服务器。
正如你所说
好奇为什么与 HTTPS 不同,我必须将证书添加到我的客户端
我想澄清的是,您的浏览器已经设置了 CA 存储,并且 AuthMode="anon" 与在浏览器的警告“这是一个虚假的银行网站,不要去那里”上单击“仍然继续”没有什么不同。
另请参阅 rsyslog 文档,这里:
此模式容易受到中间人攻击以及未经授权的访问。建议不要使用此模式。此身份验证模式下无需配置证书/密钥