Falha no aperto de mão. Não contém SANs IP

28

Estou tentando configurar o encaminhador de logstash, mas tenho problemas ao criar um canal seguro adequado. Tentando configurar isso com duas máquinas ubuntu (server 14.04) em execução no virtualbox. Eles são 100% limpos (o arquivo hosts não tocado ou instalou outros pacotes além do java, ngix, elastisearch, etc, necessários para o logstash)

Eu não acredito que este seja um problema de logstash, mas o tratamento inadequado de certificados ou algo não definido como correto no logstash ubuntu ou na máquina de encaminhamento.

Eu gerei as chaves:

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

Minha entrada conf no servidor 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"
  }
}

As chaves foram copiadas para o host do encaminhador , que possui a seguinte configuração.

{
  "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" }
    }
   ]
}

Com o servidor logstash em execução, eu 'sudo service logstash-forwarder start' na máquina do encaminhador, fornecendo o seguinte erro repetido:

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

Como mencionei anteriormente, não acredito que seja um problema de logstash, mas um problema de configuração de certificado / máquina. O problema é que não consigo resolvê-lo. Espero que algumas mentes inteligentes aqui possam me ajudar?

obrigado

connery
fonte

Respostas:

40

... Falha no tls handshake com 192.168.2.107 x509: não é possível validar o certificado para 192.168.2.107 porque ele não contém nenhuma SAN IP

O SSL precisa de identificação do par, caso contrário, sua conexão pode ser contra um intermediário que descriptografa + fareja / modifica os dados e os encaminha novamente criptografados para o destino real. A identificação é feita com certificados x509 que precisam ser validados com relação a uma CA confiável e que precisam identificar o destino ao qual você deseja se conectar.

Normalmente, o destino é fornecido como um nome de host e isso é verificado em relação ao assunto e aos nomes alternativos do certificado. Nesse caso, seu destino é um IP. Para validar o certificado com sucesso, o IP deve receber o certificado na seção de nomes alternativos do assunto, mas não como uma entrada DNS (por exemplo, nome do host), mas como IP.

Então, o que você precisa é:

  1. Edite sua seção no /etc/ssl/openssl.cnf host do logstash - adicione .subjectAltName = IP:192.168.2.107[v3_ca]

  2. Recrie o certificado

  3. Copie o certificado e a chave para os dois hosts

PS Considere adicionar -days 365ou mais à linha de comando de criação de certificado, pois a validade padrão do certificado é de apenas 30 dias e você provavelmente não deseja recriá-la todos os meses.

Steffen Ullrich
fonte
Obrigado pela resposta rápida. Eu gerei um novo certificado no servidor. Uma inspeção rápida fornece o seguinte: Emissor: C = AU, ST = Algum estado, O = Internet Widgits Pty Ltd, CN = 192.168.2.107 Onde 2.107 é o ip do servidor de logstash. Em seguida, copio o crt e a chave para a outra máquina (encaminhador) e aplico-a à configuração. Este som está correto para você? Porque ainda está reclamando da mesma coisa ...: P
connery
Por favor, ignore meu comentário acima. Agora editei /etc/ssl/openssl.cnf e adicionei subjectAltName = IP: 192.168.2.107 Criei um novo certificado com: 'sudo openssl req -x509 -nodes -newkey rsa: 2048 -keyout private / logstash-forwarder.key - out certs / logstash-forwarder.crt 'Os copiou e aplicou a configuração e o reinício (nas duas caixas). Infelizmente ainda o mesmo problema. Tendo dificuldade em pesquisar casos semelhantes sobre isso, espero que você possa me guiar para o caminho correto? :)
connery
11
Realmente o mesmo problema ou outra mensagem de erro (como autoridade de certificação desconhecida ou similar)? Por favor, publique a parte essencial do certificado, por exemplo, a openssl x509 -textpartir do certificado instalado no servidor. Verifique também se openssl s_cliento servidor retorna o certificado esperado e use -CApathcom s_client para verificar se a cadeia confiável pode ser verificada na CA configurada.
Steffen Ullrich
Eu consegui fazê-lo funcionar. Coloquei subjectAltName na seção errada. Método de trabalho: Basicamente editei o openssl.cnf, na seção [v3_ca] adicionei 'subjectAltName = IP: 192.168.2.107'. Produziu novo certificado e foi adicionado ao servidor + cliente. Obrigado pela ajuda! :)
connery
9

Há um script para a criação de certificados adequados para o lenhador mencionado em um ticket do github do logstash: O handshake do SSL falha porque as SANs IP estão ausentes

Faça o download do arquivo:

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

...construa:

go build lc-tlscert.go

..e corra:

./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",
michaelbn
fonte
11
Isso me salvou muito tempo hoje ... embora para o gitlab-runner. Obrigado!
Matt Messersmith
6

Eu tive um problema real com isso. Não estou usando o logstash, estava simplesmente tentando fazer com que as SANs IP funcionassem com o docker tls. Eu criaria o certificado, conforme descrito no artigo da janela de encaixe em https ( https://docs.docker.com/articles/https/ ), quando eu me conectaria a partir de um cliente de janela de encaixe:

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

Eu receberia este erro:

...
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 

o que estava me deixando louco. Eu admito, eu tropeço em todas as coisas abertas, então todo mundo já deve saber o que eu descobri. O exemplo subjectAltName aqui (e em qualquer outro lugar) mostra a atualização do arquivo openssl.cnf. Eu não consegui fazer isso funcionar. Fiz uma localização no openssl.cnf, copiei-o para um diretório local e fiz as alterações nele. Quando examinei o certificado, ele não continha a extensão:

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

O comando que está sendo usado para criar esse certificado está aqui (no artigo da janela de encaixe):

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

Você não pode adicionar uma linha -config openssl.cnf a este comando, ela não é válida. Nem você pode copiar o arquivo openssl.cnf para o diretório atual, modificá-lo e esperar que ele funcione dessa maneira. Algumas linhas depois, notei que o certificado 'client' usa um -extfile extfile.cnf. Então, eu tentei isso:

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

e isso consertou. Portanto, por qualquer motivo, minha versão do openssl não estava me permitindo modificar o arquivo openssl.cnf, mas eu poderia especificar o subjectAltName dessa maneira. Funciona bem!

Você pode especificar qualquer número de endereços IP, como IP: 127.0.0.1, IP: 127.0.1.1 (também não localhost).

Greg
fonte
Ah-Ha! Obrigado, estou fazendo o mesmo que você com o Docker e resolvi esse problema. Vou tentar suas sugestões agora.
Mark Jones