TLS 握手失败。不包含任何 IP SAN

TLS 握手失败。不包含任何 IP SAN

我正在尝试设置 logstash 转发器,但在建立正确的安全通道方面遇到了问题。尝试使用在 virtualbox 中运行的两台 ubuntu(服务器 14.04)机器进行配置。它们 100% 干净(没有触碰主机文件或安装除 logstash 所需的 java、ngix、elastisearch 等之外的任何其他软件包)

我认为这不是 logstash 的问题,而是证书处理不当或 logstash ubuntu 或转发器机器上的某些设置不正确。

我生成了密钥:

sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

我在 logstash 服务器上的输入配置:

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

钥匙被复制到转发主机,其具有以下配置。

{
  "network": {
    "servers": [ "192.168.2.107:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
    "ssl key": "/etc/pki/tls/certs/logstash-forwarder.key"
  },
  "files": [
    {
      "paths": [
        "/var/log/syslog",
        "/var/log/auth.log"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

在 logstash 服务器运行的情况下,‘sudo 服务 logstash-forwarder 启动’在转发器机器上,出现以下重复错误:

Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.589762 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.595105 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.595971 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.602024 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs

正如我之前提到的,我认为这不是 logstash 问题,而是证书/机器配置问题。问题是,我似乎无法解决它。希望这里有一些聪明的人可以帮助我?

谢谢

答案1

... 与 192.168.2.107 x509 进行 tls 握手失败:无法验证 192.168.2.107 的证书,因为它不包含任何 IP SAN

SSL 需要对等方进行识别,否则您的连接可能会受到中间人的攻击,中间人会解密 + 嗅探/修改数据,然后再次将数据加密转发给真实目标。识别是通过 x509 证书完成的,该证书需要根据受信任的 CA 进行验证,并且需要识别您要连接的目标。

通常,目标以主机名形式给出,并根据证书的主题和主题备用名称进行检查。在这种情况下,您的目标是一个 IP。要成功验证证书,必须在证书的主题备用名称部分中给出 IP,但不是作为 DNS 条目(例如主机名),而是作为 IP。

因此你需要的是:

  1. 编辑您的/etc/ssl/openssl.cnf 在 logstash 主机上- 添加subjectAltName = IP:192.168.2.107部分[v3_ca]

  2. 重新创建证书

  3. 将证书和密钥复制到两台主机

PS 考虑-days 365在证书创建命令行中添加或更多内容,因为默认证书有效期只有 30 天,并且您可能不想每个月重新创建它。

答案2

在 logstash github 票上提到了一个用于为 lumberjack 创建适当证书的脚本:由于缺少 IP SAN,SSL 握手失败

下载文件:

curl -O https://raw.githubusercontent.com/driskell/log-courier/1.x/src/lc-tlscert/lc-tlscert.go

...构建它:

go build lc-tlscert.go

..然后运行:

./lc-tlscert 
Specify the Common Name for the certificate. The common name
can be anything, but is usually set to the server's primary
DNS name. Even if you plan to connect via IP address you
should specify the DNS name here.

Common name: you_domain_or_whatever

The next step is to add any additional DNS names and IP
addresses that clients may use to connect to the server. If
you plan to connect to the server via IP address and not DNS
then you must specify those IP addresses here.
When you are finished, just press enter.

DNS or IP address 1: 172.17.42.1 (th ip address to trust)
DNS or IP address 2: 

How long should the certificate be valid for? A year (365
days) is usual but requires the certificate to be regenerated
within a year or the certificate will cease working.

Number of days: 3650
Common name: what_ever
DNS SANs:
    None
IP SANs:
    172.17.42.1

The certificate can now be generated
Press any key to begin generating the self-signed certificate.

Successfully generated certificate
    Certificate: selfsigned.crt
    Private Key: selfsigned.key

Copy and paste the following into your Log Courier
configuration, adjusting paths as necessary:
    "transport": "tls",
    "ssl ca":    "path/to/selfsigned.crt",

Copy and paste the following into your LogStash configuration, 
adjusting paths as necessary:
    ssl_certificate => "path/to/selfsigned.crt",
    ssl_key         => "path/to/selfsigned.key",

答案3

我对此确实有疑问。我没有使用 logstash,我只是想让 IP SAN 与 docker tls 一起工作。我将按照 https 上的 docker 文章中所述创建证书(https://docs.docker.com/articles/https/),然后当我从docker客户端连接时:

docker --tlsverify  -H tcp://127.0.0.1:2376 version

我会收到这个错误:

...
FATA[0000] An error occurred trying to connect: Get https://127.0.0.1:2376/v1.16/version: \
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs 

这让我抓狂。我承认,我对所有与 openssl 相关的事情都一知半解,所以,大家可能已经知道我发现了什么。这里(以及其他地方)的 subjectAltName 示例显示更新 openssl.cnf 文件。我无法让它工作。我定位了 openssl.cnf,将其复制到本地目录,然后对其进行了更改。当我检查证书时,它不包含扩展名:

openssl x509 -noout -text -in server-cert.pem

用于创建该证书的命令在这里(来自 docker 文章):

openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem

您不能在此命令中添加 -config openssl.cnf 行,因为它无效。您也不能将 openssl.cnf 文件复制到当前目录,对其进行修改,并希望它以这种方式工作。几行之后,我注意到“客户端”证书使用 -extfile extfile.cnf。因此,我尝试了以下操作:

echo subjectAltName = IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
   -out server-cert.pem -extfile extfile.cnf

这样就解决了问题。因此,无论出于什么原因,我的 openssl 版本都不允许我修改 openssl.cnf 文件,但是,我可以像这样指定 subjectAltName。效果很好!

您可以指定任意数量的 IP 地址,如 IP:127.0.0.1,IP:127.0.1.1(非本地主机也是如此)。

答案4

请参阅上面@Steffen Ullrich 的解决方案以获得快速修复。

还有logstash-forwarder 项目的 github 中有一个问题/一个讨论。查看它(很快,因为目前正在进行中)以获得更简单的解决方案。

相关内容