Не удалось рукопожатие. Не содержит IP-адресов SAN
Я пытаюсь настроить пересылку 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, но проблема конфигурации сертификата / компьютера. Проблема в том, что я не могу ее решить. Надеюсь, что некоторые умные умы могут помочь мне?
Спасибо
4 ответа
... Не удалось выполнить рукопожатие tls с 192.168.2.107 x509: невозможно проверить сертификат для 192.168.2.107, поскольку он не содержит IP-адресов SAN
SSL требует идентификации однорангового узла, в противном случае ваше соединение может быть связано с посредником, который дешифрует + анализирует / изменяет данные, а затем перенаправляет их в зашифрованном виде к реальной цели. Идентификация выполняется с помощью сертификатов x509, которые должны быть проверены по доверенному ЦС и которые должны идентифицировать цель, к которой вы хотите подключиться.
Обычно цель указывается в качестве имени хоста, и это проверяется на предмет и альтернативные имена субъекта сертификата. В этом случае вашей целью является IP. При успешной проверке сертификата IP-адрес должен быть предоставлен в сертификате в разделе альтернативных имен субъекта, но не в виде записи DNS (например, имени хоста), а в качестве IP-адреса.
Итак, что вам нужно, это:
Отредактируйте свой
/etc/ssl/openssl.cnf
на хосте logstash - добавьsubjectAltName = IP:192.168.2.107
в[v3_ca]
раздел.Воссоздать сертификат
Скопируйте сертификат и ключ на оба хоста
P S Рассмотрим добавление -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 в текущий каталог, изменить его и надеяться заставить его работать таким образом. Несколько строк спустя я заметил, что сертификат '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).
Начиная с 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. Посмотрите его (скоро, так как в настоящее время работа над ним ведется) для более простого решения.