我的同事交给了我这个任务,背景是这样的。
他使用常规方法在服务器上配置 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 证书和密钥:
创建一个
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 点中的文件):
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout notsecure.key -out notsecure.crt -config notsec.cnf -days 1825
这将创建一种通配符证书,接受该文件中提到的任何主机名和 IP 地址。当然,这只是一个简单的示例,您需要根据需要调整设置。