簡體   English   中英

帶有 TLS 和自簽名證書的 Neo4j Bolt:證書驗證失敗

[英]Neo4j Bolt with TLS and self-signed certificate: Certificate Verify Failed

我正在嘗試為 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 證書放入系統的信任鏈中?

顯然 Neo4j 會生成單獨的證書,如果它們還沒有用於 Bolt 連接,並且它們與 HTTPS 端點證書配置是分開的。

我的證書生成到 /var/lib/neo4j/certificates/ 中,名稱為“neo4j.cert”和“neo4j.key”。 在啟動 Neo4j 服務器之前,當我將受信任的 CA 簽名的服務器證書和密鑰復制到這些文件夾中時,它使用它們來保護 Bolt 端點,並且我能夠連接到安全的 Python 客戶端。

我遇到了類似的問題,對我來說,設置encrypted=False成功了:

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

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

從 Neo4j 版本 4 開始,Python 驅動程序實現了一組 新的連接協議

  • neo4j+s:// : Neo4jDriver 加密(僅接受由證書頒發機構簽署的證書),完整的證書檢查。
  • neo4j+ssc:// : Neo4jDriver 加密(接受自簽名證書)。
  • neo4j:// :沒有加密的 Neo4jDriver。

因此,您可以使用以下內容來允許自簽名證書。 與往常一樣,請注意這是不安全的,所以不要在生產中使用!

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

您也可以選擇對bolt執行相同的bolt ,但首選neo4j ,因為它可以在集群( neo4j )和獨立的單實例服務器上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM