具有TLS和自签名证书的Neo4j Bolt:证书验证失败

时间:2018-07-15 06:33:38

标签: python neo4j openssl tls1.2 neo4j-python-driver

我正在尝试为CentOS7上的Bolt通信启用启用TLS的Neo4j。该服务器当前作为系统服务安装。我已经生成了一个自签名证书和密钥:

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 / trusted / 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端点?如果是这样,如何将Bolt端点的CA证书获取到系统的信任链中?

3 个答案:

答案 0 :(得分:0)

显然,如果Bolt连接尚不存在Neo4j,则它们会生成单独的证书,并且它们与HTTPS端点证书配置是分开的。

我的证书已生成到名称为“ neo4j.cert”和“ neo4j.key”的/ var / lib / neo4j / certificates /中。在启动Neo4j服务器之前,当我将我受信任的CA签名的服务器证书和密钥复制到这些文件夹中时,它使用它们来保护Bolt端点,从而能够与受保护的Python客户端连接。

答案 1 :(得分:0)

我遇到了类似的问题,对我来说,设置encrypted=False可以解决问题:

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

来源: https://github.com/neo4j/neo4j/issues/12392#issuecomment-583899597

答案 2 :(得分:0)

自 Neo4j 版本 4 起,Python 驱动程序实现了 new set of connection protocols

  • neo4j+s://:Neo4jDriver 加密(仅接受由证书颁发机构签署的证书),完整的证书检查。
  • neo4j+ssc://:Neo4jDriver 加密(接受自签名证书)。
  • neo4j://:没有加密的 Neo4jDriver。

因此您可以使用以下内容来允许自签名证书。与往常一样,请注意这是不安全的,因此请勿在生产中使用!

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

您也可以选择对 bolt 执行相同操作,但首选 neo4j,因为它will work on both 是一个集群(带路由)和一个独立的单实例服务器。

相关问题