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

28

Я пытаюсь настроить пересылку logstash, но у меня проблемы с созданием правильного безопасного канала. Попытка настроить это на двух компьютерах с Ubuntu (сервер 14.04), работающих в virtualbox. Они на 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

Мой входной файл conf на сервере 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 на компьютере пересылки, выдавая следующую повторяющуюся ошибку:

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, но проблема конфигурации сертификата / компьютера. Проблема в том, что я не могу ее решить. Надеюсь, что некоторые умные умы могут помочь мне?

Благодарность

Коннери
источник

Ответы:

40

... Не удалось выполнить рукопожатие 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 дней, и вы, вероятно, не хотите создавать его заново каждый месяц.

Штеффен Ульрих
источник
Спасибо за быстрый ответ. Я создал новый сертификат на сервере. Быстрая проверка дает мне следующее: Эмитент: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = 192.168.2.107, где 2.107 - ip сервера logstash. Затем я копирую crt и key на другой компьютер (сервер пересылки) и применяю его к конфигурации. Это звучит правильно для вас? Потому что он все еще ноет о том же самом ...: P
connery
Пожалуйста, игнорируйте мой комментарий выше. Сейчас я отредактировал /etc/ssl/openssl.cnf и добавил subjectAltName = IP: 192.168.2.107. Создал новый сертификат с помощью: 'sudo openssl req -x509 -nodes -newkey rsa: 2048 -keyout private / logstash-forwarder.key - out certs / logstash-forwarder.crt 'Скопировал их и применил конфигурацию и перезапуск (на обоих полях). К сожалению, все та же проблема. Испытывая трудности с поиском подобных случаев, надеюсь, вы сможете направить меня на правильный путь? :)
Коннери
1
Действительно та же самая проблема или другое сообщение об ошибке (как неизвестный CA или подобное)? Пожалуйста, опубликуйте основную часть сертификата, например, openssl x509 -textиз сертификата, установленного на сервере. Также проверьте, openssl s_clientчто сервер возвращает ожидаемый сертификат и используйте его -CApathс s_client, чтобы проверить, что цепочка доверия может быть проверена по настроенному CA.
Штеффен Ульрих
Мне удалось заставить его работать. Я поставил subjectAltName не в том разделе. Метод работы: В основном я отредактировал openssl.cnf, в разделе [v3_ca] я добавил 'subjectAltName = IP: 192.168.2.107'. Произведен новый сертификат и добавлен сервер + клиент. Спасибо за вашу помощь! :)
Коннери
9

Существует сценарий для создания надлежащих сертификатов для дровосека, который был упомянут в билете 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",
michaelbn
источник
1
Это сэкономило мне много времени сегодня ... хотя и для бегуна на гитлах. Спасибо!
Мэтт Мессерсмит
6

У меня была настоящая проблема с этим. Я не использую 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 в текущий каталог, изменить его и надеяться заставить его работать таким образом. Несколько строк спустя я заметил, что сертификат 'client' использует -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).

Greg
источник
Ах-ха! Спасибо, я делаю то же самое, что и вы с докером, и решил эту проблему. Я попробую ваши предложения сейчас.
Марк Джонс