Болт Neo4j с TLS и самозаверяющим сертификатом: сертификат не прошел проверку

Я пытаюсь настроить Neo4j с включенным TLS для Болтовой связи на CentOS7. В данный момент сервер установлен как системный сервис. Я сгенерировал самозаверяющий сертификат и ключ:

sudo openssl genrsa -des3 -out /var/ssl/ca.key 4096``
sudo openssl req -new -x509 -days 365 -key /var/ssl/ca.key -out /var/ssl/ca.crt
sudo openssl genrsa -des3 -out /var/ssl/neo4j/serv.key 1024``
sudo openssl req -new -key /var/ssl/neo4j/serv.key -out /var/ssl/neo4j/server.csr
sudo openssl x509 -req -days 365 -in /var/ssl/neo4j/server.csr -CA /var/ssl/ca.crt -CAkey /var/ssl/ca.key -set_serial 01 -out /var/ssl/neo4j/server.crt
sudo openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in /var/ssl/neo4j/serv.key -out /var/ssl/neo4j/server.key

Затем я скопировал файл server.crt в /var/ssl/trust /neo4j (согласно документации Neo4j) и добавил следующие строки в мой neo4j.conf:

dbms.ssl.policy.default.trusted_dir=/var/ssl/trusted/neo4j
dbms.ssl.policy.default.public_certificate=/var/ssl/neo4j/server.crt
dbms.ssl.policy.default.private_key=/var/ssl/neo4j/server.key
dbms.ssl.policy.default.base_directory=/var/ssl/neo4j/
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=REQUIRED

Наконец, я добавил файл ca.crt в цепочку доверенных сертификатов моей системы:

sudo cp /var/ssl/ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

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

neo4j.exceptions.SecurityError: Failed to establish secure connection to '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'

Код Python, который выдает ошибку:

from neo4j.v1 import GraphDatabase
from neo4j.v1 import TRUST_SYSTEM_CA_SIGNED_CERTIFICATES
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "neo4j"), trust=TRUST_SYSTEM_CA_SIGNED_CERTIFICATES)

Сертификат CA должен быть добавлен в мою цепочку доверия системы, и другие приложения могут использовать его, однако создается впечатление, что клиент Neo4j не может использовать его для проверки сертификата, возвращенного с сервера. Использует ли Neo4j только этот CA для конечной точки HTTPS, а не конечную точку TLS? Если так, как я могу получить сертификат CA для конечной точки Bolt в цепочку доверия моей системы?

3 ответа

Начиная с Neo4j версии 4, драйвер Python реализует новый набор протоколов подключения.

  • neo4j+s://: Neo4jDriver с шифрованием (принимает только сертификаты, подписанные центром сертификации), полная проверка сертификатов.
  • neo4j+ssc://: Neo4jDriver с шифрованием (принимает самоподписанные сертификаты).
  • neo4j://: Neo4jDriver без шифрования.

Таким образом, вы можете использовать следующее, чтобы разрешить самозаверяющие сертификаты. Как всегда, обратите внимание, что это небезопасно, поэтому не используйте его в продакшене!

      uri = "neo4j+scc://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "neo4j"))

У вас также есть возможность сделать то же самое с bolt, но neo4jявляется предпочтительным, поскольку он будет работать как в кластере (с маршрутизацией), так и на автономном сервере с одним экземпляром.

У меня была аналогичная проблема, и я установил encrypted=False сделал трюк:

driver = GraphDatabase.driver("bolt://localhost", auth=("neo4j", ""), encrypted=False)

источник: https://github.com/neo4j/neo4j/issues/12392

Очевидно, Neo4j генерирует отдельные сертификаты, если они еще не присутствуют для соединения Bolt, и они отделены от конфигураций сертификатов конечной точки HTTPS.

Мои сертификаты были сгенерированы в /var/lib/neo4j/ Certificates/ с именами 'neo4j.cert' и 'neo4j.key'. Когда я скопировал сертификат сервера и ключ, подписанный моим доверенным центром сертификации, в эти папки до запуска сервера Neo4j, он использовал их для защиты конечной точки Bolt, и я смог подключиться к защищенному клиенту Python.

Другие вопросы по тегам