Вывод Logstash HTTP не может быть отправлен на конечную точку HTTPS, требующую клиентских сертификатов

#ssl #nginx #logstash #filebeat #pkcs#8

#ssl #nginx #logstash #файловый удар #pkcs # 8

Вопрос:

В настоящее время я пытаюсь отправить некоторые примеры событий с серверов, принимающих Logstash, в нашей производственной среде в среду тестирования через вывод http.
Сервер на принимающей стороне является пользовательской конечной точкой Nginx HTTPS, которая принимает данные post (конечные точки как для отдельных событий, так и для массовых событий для поддержки формата массового индексирования Elasticsearch) и помещает их в очередь redis, которая в конечном итоге считывается серверами обработки Logstash.

Текущий вывод http на сервере, получающем logstash, выглядит примерно так:

  http {
   url => "https://json-logs-endpoint.example.com:8443/event"
   http_method => "post"
   format => "json"
   ssl_certificate_validation => false
   client_cert => "/etc/filebeat/ssl/filebeat.crt"
   client_key => "/etc/filebeat/ssl/filebeat.key"
   cacert => "/etc/filebeat/ssl/filebeat.chain"
 }
  

Параметры, связанные с сертификатом, используют те же файлы, что и filebeat log shipper (установленный на всех серверах), через вывод elasticsearch. Разрешения для файлов в /etc/filebeat/ssl/ позволяют logstash считывать сертификаты. Моя конфигурация filebeat повторяет что-то вроде этого:

 filebeat:
  prospectors: []
  registry_file: "/var/lib/filebeat/registry"
  config_dir: "/etc/filebeat/conf.d"
output:
  elasticsearch:
    enabled: true
    hosts:
    - json-logs-endpoint.example.com:8443
    protocol: https
    path: "/multi-event"
    tls:
      certificate_authorities:
      - "/etc/filebeat/ssl/filebeat.chain"
      certificate: "/etc/filebeat/ssl/filebeat.crt"
      certificate_key: "/etc/filebeat/ssl/filebeat.key"
  

Все экземпляры filebeat на всех серверах успешно отправляют данные по протоколу https на этот сервер Nginx через /multi-event конечную точку.

Единственное различие между /event и /multi-event конечными точками заключается в том, что первая принимает одно событие JSON, а вторая принимает данные в формате запроса на массовую индексацию elasticsearch.
Обе конечные точки защищены с помощью SSL одинаковым образом. При запуске Logstash нет никаких указаний на какую-либо ошибку, связанную с выводом http, хотя после очень короткого периода времени конвейер по существу останавливается. Запуск logstash в подробном режиме затем предоставляет немного больше информации с этой трассировкой стека.

Я предполагаю, что проблема связана с форматом предоставленных сертификатов? Я был бы очень признателен, если бы кто-нибудь мог указать на мою проблему.

Спасибо!

Ответ №1:

Похоже, проблема была связана с тем, что файл ключа клиента, указанный в выводе http:

 client_key => "/etc/filebeat/ssl/filebeat.key"
  

должен был быть в формате PKCS8. Однажды я выполнил следующую команду, чтобы преобразовать ее в правильный формат:

 openssl pkcs8 -topk8 -nocrypt -in '/etc/filebeat/ssl/filebeat.key' -out '/etc/filebeat/ssl/pkcs8-filebeat.key'
  

а затем обновил параметр client_key, чтобы указать на ключ в формате PKCS8:

 client_key => "/etc/filebeat/ssl/pkcs8-filebeat.key"
  

Это решило проблему, и запросы POST HTTPS не работают должным образом. Надеюсь, это окажется полезным для кого-то еще в будущем.