首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tls握手失败。不包含任何IP SANs。

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

Server Fault用户
提问于 2014-07-09 04:23:55
回答 4查看 176K关注 0票数 50

我正试图建立一个日志转发器,但我对建立一个适当的安全通道有问题。试图用在virtualbox中运行的两台ubuntu (服务器14.04)机器来配置它。它们是100%干净的(除了所需的java、ngix、弹性搜索等外,没有安装任何其他用于logstash的包)

我不认为这是一个日志存储问题,但是在logstash或转发器机器上不正确地处理证书或设置错误的东西.

我生成了钥匙:

代码语言:javascript
复制
sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

我在logstash服务器上的输入conf:

代码语言:javascript
复制
input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

键被复制到转发主机,该主机具有以下配置。

代码语言:javascript
复制
{
  "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 service logstash-forwarder start”,给出以下重复错误:

代码语言:javascript
复制
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

正如我前面提到的,我不认为这是一个日志存储问题,而是证书/机器配置问题。问题是,我似乎解决不了这个问题。希望这里一些聪明的人能帮我解决问题?

谢谢

EN

回答 4

Server Fault用户

回答已采纳

发布于 2014-07-09 04:33:44

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

SSL需要对对等方进行标识,否则您的连接可能是针对中间人的,后者解密+嗅探/修改数据,然后再将加密后的数据转发给真正的目标。标识是使用x509证书完成的,这些证书需要根据受信任的CA进行验证,并且需要标识要连接到的目标。

通常,目标被指定为主机名,这将根据证书的主题和主题替代名称进行检查。在这种情况下,您的目标是一个IP。成功验证证书--必须在subject alternative names部分中给IP颁发证书,但不是作为DNS条目(例如主机名),而是作为IP。

所以你需要的是:

  1. 在logstash主机上编辑/etc/ssl/openssl.cnf -在[v3_ca]部分添加subjectAltName = IP:192.168.2.107
  2. 重新创建证书
  3. 将证书和密钥复制到两个主机

PS考虑在证书创建命令行中添加-days 365或更多,因为默认的证书有效性仅为30天,您可能不希望每个月重新创建它。

票数 55
EN

Server Fault用户

发布于 2014-08-23 12:43:23

在logstash票证上提到了为伐木工人创建适当证书的脚本:由于IP无丢失,SSL握手失败。

下载文件:

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

...build it:

代码语言:javascript
复制
go build lc-tlscert.go

..and运行:

代码语言:javascript
复制
./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",
票数 14
EN

Server Fault用户

发布于 2015-02-11 19:05:31

我对这件事很不满意。我没有使用logstash,我只是想让IP SANs与码头tls一起工作。我将像https (https://docs.docker.com/articles/https/)上的docker文章所描述的那样创建证书,然后当我从码头客户端连接时:

代码语言:javascript
复制
docker --tlsverify  -H tcp://127.0.0.1:2376 version

我会得到这个错误:

代码语言:javascript
复制
...
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上做了一个定位,将其复制到一个本地目录,然后对其进行更改。当我检查证书时,它没有包含扩展名:

代码语言:javascript
复制
openssl x509 -noout -text -in server-cert.pem

用于创建证书的命令如下(来自docker文章):

代码语言:javascript
复制
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文件复制到当前目录,修改它,并希望它能够以这种方式工作。几行之后,我注意到'client‘cert使用了一个-extfile extfile.cnf。所以,我试过这个

代码语言:javascript
复制
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 (非本地主机)。

票数 8
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/611120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档