Falha no handshake. Não contém SANs IP

23

Estou tentando configurar o encaminhador logstash, mas tenho problemas em criar um canal seguro adequado. Tentando configurar isso com duas máquinas do Ubuntu (servidor 14.04) em execução no VirtualBox. Eles são 100% limpos (arquivos de hosts não tocados ou instalados em outros pacotes que não sejam o java, ngix, elastisearch, etc, para logstash)

Eu não acredito que isso seja um problema de logstash, mas manuseio inadequado de certificados ou algo não definido como correto no logstash ubuntu ou na máquina do encaminhador.

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, me dando 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 sim de configuração de certificado / máquina. O problema é que não consigo resolvê-lo. Espero que algumas mentes espertas aqui possam me ajudar?

Obrigado

    
por connery 09.07.2014 / 06:23

4 respostas

32

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

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

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

Então, o que você precisa é:

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

  2. Recrie o certificado

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

PS Considere adicionar -days 365 ou mais à linha de comando da criação do certificado, pois a validade do certificado padrão é de apenas 30 dias e você provavelmente não desejará recriá-lo todo mês.

    
por 09.07.2014 / 06:33
8

Existe um script para criar os certificados apropriados para o lenhador mencionados em um ticket do logstash github: O handshake 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 execute:

./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",
    
por 23.08.2014 / 14:43
6

Eu tive um problema real com isso. Eu não estou usando logstash, eu estava simplesmente tentando obter SANs IP para trabalhar com o docker tls. Eu criaria o certificado conforme descrito no artigo do docker em https ( link ) e, em seguida, quando eu me conectaria de uma janela de encaixe cliente:

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

Eu recebo 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 

que estava me deixando louco. Eu admito, eu tropeço em todas as coisas abertas, então, todo mundo já pode saber o que eu descobri. O exemplo subjectAltName aqui (e em todo lugar mais) mostra a atualização do arquivo openssl.cnf. Eu não consegui fazer isso funcionar. Eu fiz um locate no openssl.cnf, copiei 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 usado para criar esse certificado está aqui (no artigo do docker):

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, ele não é válido. 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 arquivo -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 resolveu. Então, por alguma razão minha versão do openssl não estava me permitindo modificar o arquivo openssl.cnf, mas, eu poderia especificar o subjectAltName como este. Funciona muito bem!

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

    
por 11.02.2015 / 20:05
0

Por favor, veja a solução do @Steffen Ullrich acima para uma solução rápida.

Há também um problema / a discutindo sobre isso no github do projeto logstash-forwarder . Veja (em breve, como atualmente funciona, está em andamento) para uma solução mais fácil.

    
por 17.07.2014 / 10:54