Назад | Перейти на главную страницу

Не удалось выполнить рукопожатие tls. Не содержит IP-сетей SAN

Я пытаюсь настроить пересылку logstash, но у меня возникают проблемы с созданием надлежащего безопасного канала. Попытка настроить это с двумя машинами ubuntu (сервер 14.04), работающими в виртуальном боксе. Они на 100% чистые (не затрагиваются файл hosts или не установлены какие-либо другие пакеты, кроме необходимых 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:

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

Как я упоминал ранее, я не считаю, что это проблема с журналом, а проблема с конфигурацией сертификата / компьютера. Проблема в том, что я не могу ее решить. Надеюсь, здесь мне помогут умные умы?

Спасибо

... Не удалось выполнить рукопожатие tls с 192.168.2.107 x509: невозможно проверить сертификат для 192.168.2.107, потому что он не содержит IP-сетей SAN

SSL требует идентификации однорангового узла, иначе ваше соединение может быть против злоумышленника, который расшифровывает + анализирует / изменяет данные, а затем снова пересылает их в зашифрованном виде на реальную цель. Идентификация выполняется с помощью сертификатов x509, которые необходимо проверить в доверенном центре сертификации и которые должны идентифицировать цель, к которой вы хотите подключиться.

Обычно цель указывается как имя хоста, и это проверяется по альтернативным именам субъекта и субъекта сертификата. В этом случае ваша цель - IP. Для успешной проверки сертификата IP должен быть предоставлен в сертификате в разделе альтернативных имен субъектов, но не как запись DNS (например, имя хоста), а как IP.

Итак, что вам нужно:

  1. Отредактируйте свой /etc/ssl/openssl.cnf на хосте logstash - Добавить subjectAltName = IP:192.168.2.107 в [v3_ca] раздел.

  2. Восстановить сертификат

  3. Скопируйте сертификат и ключ на оба хоста

PS Рассмотрите возможность добавления -days 365 или больше в командную строку создания сертификата, поскольку срок действия сертификата по умолчанию составляет всего 30 дней, и вы, вероятно, не захотите воссоздавать его каждый месяц.

Существует сценарий для создания правильных сертификатов для лесоруба, который был упомянут в билете github logstash: Подтверждение связи 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",

У меня была настоящая проблема с этим. Я не использую logstash, я просто пытался заставить IP SAN работать с docker tls. Я бы создал сертификат, как описано в статье о докере на https (https://docs.docker.com/articles/https/), а затем, когда я подключусь из докер-клиента:

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 

что сводило меня с ума. Признаюсь, я натыкаюсь на все, что связано с openssl, так что все могут уже знать, что я обнаружил. Пример subjectAltName здесь (и везде) показывает обновление файла openssl.cnf. Я не мог заставить это работать. Я нашел на openssl.cnf, скопировал его в локальный каталог, а затем внес в него изменения. Когда я изучил сертификат, он не содержал расширения:

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

Команда, используемая для создания этого сертификата, находится здесь (из статьи о докере):

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

Начиная с OpenSSL 1.1.1, предоставление subjectAltName непосредственно в командной строке становится много проще, с введением -addext флаг openssl req

Пример:

export HOST="my.host"
export IP="127.0.0.1"
openssl req -newkey rsa:4096 -nodes -keyout ${HOST}.key -x509 -days 365 -out ${HOST}.crt -addext 'subjectAltName = IP:${IP}' -subj '/C=US/ST=CA/L=SanFrancisco/O=MyCompany/OU=RND/CN=${HOST}/'

Вдохновленный ссылка на сайт

Пожалуйста, посмотрите решение @Steffen Ullrich выше для быстрого исправления.

А также есть проблема / обсуждение этого в github проекта logstash-forwarder. Посмотрите его (скоро, так как в настоящее время работа над ним продолжается), чтобы найти более простое решение.