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

我正在尝试设置logstash转发器,但在创build适当的安全通道方面存在问题。 尝试使用两个在virtualbox中运行的ubuntu(服务器14.04)机器进行configuration。 他们是100%干净(没有触及主机文件或安装除了所需的java,ngix,elastisearch等用于logstash的其他软件包)

我不认为这是一个logstash问题,但是在logstash ubuntu或转发器机器上不正确的处理证书或者没有设置正确的。

我生成的密钥:

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

我在logstash服务器上的inputconf:

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

密钥被复制到具有以下configuration的转发主机

 { "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 start”服务 ,给了我以下重复的错误:

 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问题,但证书/机器configuration问题。 问题是,我似乎无法解决它。 希望这里有些聪明的人能帮助我?

谢谢

    …无法与192.168.2.107 x509握手:无法validation192.168.2.107的证书,因为它不包含任何IP SAN

    SSL需要识别对等体,否则你的连接可能与中间人解密,嗅探/修改数据,然后再将它们encryption转发给真正的目标。 使用x509证书进行身份validation,这些证书需要针对可信CA进行validation,并且需要确定要连接的目标。

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

    所以你需要的是:

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

    2. 重新创build证书

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

    PS考虑在证书创build命令行中添加-days 365或更多date,因为默authentication书有效期仅为30天,您可能不希望每个月重新创build一次。

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

    下载文件:

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

    …build立它:

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

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

    这让我疯狂。 我承认,我在所有的事情上都摔了一跤,所以每个人都可能已经知道我发现了什么。 这里的subjectAltName示例(以及其他地方)显示了更新openssl.cnf文件。 我无法得到这个工作。 我find了openssl.cnf,将其复制到本地目录,然后对其进行更改。 当我检查证书时,它没有包含扩展名:

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

    正在用来创build该证书的命令在这里(从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(非本地主机)。

    请参阅上面的@Steffen Ullrich的解决scheme,以便快速修复。

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