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


28

我正在尝试设置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服务器上的输入conf:

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-转发器启动”,给我以下重复错误:

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问题,而是证书/机器配置问题。问题是,我似乎无法解决。希望这里有一些聪明的人可以帮助我?

谢谢

Answers:


40

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

SSL需要对等方的标识,否则您的连接可能会遇到中间人,该中间人解密+嗅探/修改数据,然后将它们再次加密转发到真实目标。使用x509证书进行标识,该证书需要针对受信任的CA进行验证,并且需要标识要连接的目标。

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

因此,您需要做的是:

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

  2. 重新创建证书

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

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


感谢您的快速回复。我在服务器上生成了一个新证书。快速检查如下:发行者:C = AU,ST = Some-State,O = Internet Widgits Pty Ltd,CN = 192.168.2.107其中2.107是Logstash服务器ip。然后,我将crt和密钥复制到另一台计算机(转发器)并将其应用于配置。这听起来对您正确吗?因为它仍然在抱怨同样的事情...:P
connery 2014年

请忽略以上我的评论。我现在已经编辑了/etc/ssl/openssl.cnf并添加了subjectAltName = IP:192.168.2.107使用以下命令创建了一个新证书:'sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout private / logstash-forwarder.key- out certs / logstash-forwarder.crt'复制它们并应用config并重新启动(在两个框中)。不幸的是仍然是同样的问题。很难在此上搜索类似的案例,所以希望您能够引导我走正确的道路?:)
connery 2014年

1
真的是同一问题还是其他错误消息(例如未知的CA或类似消息)?请发布证书的重要部分,例如, openssl x509 -text从服务器上安装的证书中发布。请同时检查openssl s_client服务器是否返回了预期的证书,并-CApath与s_client一起使用以检查是否可以针对配置的CA验证信任链。
斯特芬·乌尔里希

我设法使它起作用。我将subjectAltName放在错误的部分。工作方法:基本上,我编辑了openssl.cnf,在[v3_ca]部分中添加了'subjectAltName = IP:192.168.2.107'。产生新证书并添加到服务器+客户端。谢谢你的帮助!:)
connery 2014年

9

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

下载文件:

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",

1
今天这为我节省了很多时间...尽管使用了gitlab-runner。谢谢!
马特·梅瑟史密斯

6

我对此有一个真正的问题。我没有使用logstash,只是在尝试使IP SAN与docker tls一起使用。我将按照https(https://docs.docker.com/articles/https/)上的Docker文章中所述创建证书,然后从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 

这让我发疯。我承认,我在opensl的​​所有方面都遇到了麻烦,所以,每个人可能已经知道我所发现的内容。这里(以及其他所有地方)的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(以及非localhost)。


啊哈!谢谢,我和docker在做同样的事情,并且遇到了这个问题。我将尝试您的建议。
Mark Jones

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.