Болт 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)
Очевидно, Neo4j генерирует отдельные сертификаты, если они еще не присутствуют для соединения Bolt, и они отделены от конфигураций сертификатов конечной точки HTTPS.
Мои сертификаты были сгенерированы в /var/lib/neo4j/ Certificates/ с именами 'neo4j.cert' и 'neo4j.key'. Когда я скопировал сертификат сервера и ключ, подписанный моим доверенным центром сертификации, в эти папки до запуска сервера Neo4j, он использовал их для защиты конечной точки Bolt, и я смог подключиться к защищенному клиенту Python.