Logstash-forwarder 抛出 SSL 错误

Logstash-forwarder 抛出 SSL 错误

我的同事交给了我这个任务,背景是这样的。

他使用常规方法在服务器上配置 Logstash,并在所有代理上配置 Logstash-forwarder,从而使 ELK(Elasticsearch、Logstash 和 Kibana)堆栈与我们的 RHEL 6.2 服务器协同工作。除了两个 logstash 代理节点外,一切都按预期正常运转。它没有从这两个节点索引数据,这两个代理节点与环境中的其他代理略有不同。所有代理(正在运行)都在运行带有“OpenSSL 1.0.0-fips”的 RHEL 6.2 机器,而两个有问题的代理则在运行带有“OpenSSL 0.9.8e-fips-rhel5”的 RHEL 5.5。现在,让我解释一下我开始这项工作时这两个节点面临的问题。

当我们使用“/etc/init.d/logstash-forwarder restart”重新启动 logstash 转发器服务时,它会引发以下错误:

2014/10/01 09:21:23.898917 无法与 10.xxx x509 进行 tls 握手:无法验证 10.xxx 的证书,因为它不包含任何 IP SAN 2014/10/01 09:21:24.900502 连接到 [10.xxx]:5000 (10.xxx) 2014/10/01 09:21:24.902081 无法与 10.xxx x509 进行 tls 握手:无法验证 10.xxx 的证书,因为它不包含任何 IP SAN 2014/10/01 09:21:25.903970 连接到 [10.xxx]:5000 (10.xxx) 2014/10/01 09:21:25.905708 无法与 10.xxx x509 进行 tls 握手:无法验证 10.xxx 的证书,因为它不包含任何 IP SAN

我理解这是因为代理正尝试使用其 IP 地址通过 SSL 连接到服务器,因此我再次使用 IP SAN 重新创建了证书,然后它开始向我抛出以下错误,不仅是 5.2 机器,还有 6.2 机器:

2014/10/03 17:09:12.403253 无法与 10.xxx x509 进行 tls 握手:证书由未知颁发机构签名 2014/10/03 17:09:13.404974 连接到 [10.xxx]:5000 (10.xxx) 2014/10/03 17:09:13.428156 无法与 10.xxx x509 进行 tls 握手:证书由未知颁发机构签名 2014/10/03 17:09:14.429648 连接到 [10.xxx]:5000 (10.xxx) 2014/10/03 17:09:14.442006 无法与 10.xxx x509 进行 tls 握手:证书由未知颁发机构签名

我尝试通过将新的 logstash 证书附加到 CA 文件来将证书添加到 ca-bundle.crt:

‘openssl x509 -in certs/logstash-forwarder.crt -text >> certs/ca-bundle.crt’。

我觉得,如果我能够将“IP SAN”证书添加到所有代理节点的受信任证书列表中,我将能够解决整个问题。我的问题是:

还有一件事,Logstash 服务器正在运行 RHEL 6.2。并且所有代理节点(工作和非工作)都安装了相同版本的 logstash-forwarder - logstash-forwarder-0.3.1-1.x86_64.rpm。使这些代理节点接受 IP SAN 证书的正确方法是什么?我理解问题正确吗?RHEL 6.x 和 RHEL 5.x 机器之间是否存在不兼容性?

我在 /etc/logstash-forwarder 中有以下条目

[root@name2 ~]# cat /etc/logstash-forwarder { “network”: { “servers”: [ “10.xxx:5000” ], “timeout”: 15, “ssl ca”: “/etc/pki/tls/certs/logstash-forwarder.crt”, “ssl strict verify”: “false” }, “files”: [ { “paths”: [ “/var/log/maillog” ], “fields”: { “type”: “syslog” } } ] } [root@name2 ~]#

提前致谢。

答案1

您正在使用的证书没有消息中提到的任何有效的 IP SAN:

Failed to tls handshake with x.x.x.x x509: cannot validate certificate for x.x.x.x because 
it doesn't contain any IP SANs  

如果您使用 IP 地址进行连接,则您的证书必须包含匹配的 IP SAN 才能通过 Go 1.3 及更高版本的验证。任何 README 文件或文档中均未提及这一点(目前尚未提及),但存在一些问题(#226#221) 在项目 github repo 上打开。
要允许 IP 地址作为服务器名称,SSL 证书必须包含 IP 地址作为subjectAltName字段。

为了解决这个问题,您可以使用以下步骤创建 SSL 证书和密钥:

  1. 创建一个notsec.cfr包含如下输出的文件(或任何其他名称):

    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    
    [req_distinguished_name]
    C = TG
    ST = Togo
    L =  Lome
    O = Private company
    CN = *
    
    [v3_req]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    basicConstraints = CA:TRUE
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = *
    DNS.2 = *.*
    DNS.3 = *.*.*
    DNS.4 = *.*.*.*
    DNS.5 = *.*.*.*.*
    DNS.6 = *.*.*.*.*.*
    DNS.7 = *.*.*.*.*.*.*
    IP.1 = 192.168.1.1
    IP.2 = 192.168.69.14  
    

如果您通过主机名连接,则可以删除 IP SAN,否则添加您的 logstash 服务器 IP 地址。

  1. 使用以下命令创建证书和密钥(使用第 1 点中的文件):

    openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout notsecure.key -out notsecure.crt -config notsec.cnf -days 1825
    

这将创建一种通配符证书,接受该文件中提到的任何主机名和 IP 地址。当然,这只是一个简单的示例,您需要根据需要调整设置。

相关内容