Нифи и Postgresql с сертификатом: как установить клиентский сертификат и ключ? - PullRequest
1 голос
/ 02 марта 2020

У меня есть образ NIFI, работающий в openshift, и postgres в облаке, "принадлежащем" другому отделу.

Они отправили нам сертификат (". Crt") и ключ (".key"), так как вход в систему осуществляется через клиентский сертификат, а не имя пользователя и пароль. Мне удалось войти в pgAdmin 4, но не подключить NIFI к Postgres с сертификатом и ключом.

Я загрузил сертификат и ключ к образу (используя секретный и монтирующий его), поэтому, если я go к терминалу pod, я могу получить к нему доступ.

Но, когда я перехожу к сервису DBCPConnectionPoll, строка подключения ниже и активирует процессор Execute SQL, я получаю исключение, что сертификат недействителен, как указано ниже:

ERROR
ExecuteSQL[id=...] Unable to execute SQL query <...>;
due to java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate).
No FlowFile to route to failure: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate)

Я пытался передать сертификат двумя способами в службу DBCPConnectionPoll:

1) в качестве параметров в строке подключения (свойство «URL-адрес подключения к базе данных»:

jdbc:postgresql://<ip>:<port>/<username>?user=<username>&sslTrue&sslcert=/etc/.../mycerts/mycert.der&sslkey=/etc/.../mycerts/mykey.key.pk8

2) добавление свойств в службу (кнопка +, просто имя параметра и путь в качестве значения) и просто передача его в виде url:

jdbc:postgresql://<ip>:<port>/<username>

Похоже, что все работает в общем, так как я могу подключиться к другому postgres, который у меня есть, который не требует ssl-сертификации.

Некоторые соображения:

1) Мое предположение здесь заключается в том, что строка подключения в NIFI не знает, как правильно прочитать путь к файлу для сертификата и ключа.

2) У меня есть несколько раз конвертировал сертификаты в разные типы, которые java может получить, чтобы увидеть, была ли это проблема, но я все еще получаю то же исключение. Таким образом, кажется, что пул соединений просто не «достигает» файлов вообще. Тем не менее, если кто-то имеет право голоса в этой теме c, это может быть удобно после решения основной проблемы. Так что оцените некоторые советы и здесь.

3) Я также прочитал исходный код NIFI, и кажется, что NIFI обычно использует классы JDB C для создания пула соединений, поэтому строка подключения, которую я передал, будет работал в java коде, но почему-то не работает в NIFI (который написан в java).

4) Драйвер jdb c и все остальное настроено правильно, так как я могу работать с небезопасным postgres в NIFI.

Большое спасибо.

1 Ответ

0 голосов
/ 19 марта 2020

Сотрудник нашел «простое решение» проблемы, которую я задал, и я хотел бы поделиться, чтобы она могла помочь другим.

Отсутствовало свойство sslmode = require. После этого сервис работал отлично. На самом деле, я не уверен, почему он не работал с sslmode = предпочитать, так как это то, что мой pgadmin использует для той же базы данных, и там он работает отлично. Похоже, что в этом случае мы должны «заставить» nifi использовать ssl - см. Документацию здесь: https://jdbc.postgresql.org/documentation/head/ssl-client.html.

Более того, некоторые идеи:

  1. Он работал с сертификатом в формате «.der» и вводил в формате «.pk8» (не нужно было использовать хранилище доверенных сертификатов и хранилище ключей, как это требуется в других службах).

  2. Можно добавить в кнопку «плюс» свойства и дать им правильное имя, как мы сделали бы в коде java, вместо того, чтобы объединять каждое свойство в строке подключения (см. Второй вариант в вопросе выше).

Сделайте так, чтобы это помогало и другим.

...