Neo4j Bolt使用TLS和自签名证书:证书验证失败。

4

我正在尝试在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

接下来,我按照Neo4j的文档将server.crt文件复制到/var/ssl/trusted/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是否仅在HTTPS端点中使用此CA,而不是TLS端点?如果是这样,如何将Bolt端点的CA证书添加到我的系统信任链中?

3个回答

0

自 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,因为它 可以在群集(带路由)和独立单实例服务器上运行


0

0

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

我的证书生成在/var/lib/neo4j/certificates/中,名称为'neo4j.cert'和'neo4j.key'。在启动Neo4j服务器之前,我将由受信任的CA签名的服务器证书和密钥复制到这些文件夹中,它们用于保护Bolt端点,我能够使用安全的Python客户端进行连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接