Skip to content

Neo4j SSL/TLS 配置

配置文件位置

Neo4j 的 SSL/TLS 配置主要通过 neo4j.conf 文件进行管理,证书文件通常存储在 certificates/ 目录下。

证书管理

证书是 SSL/TLS 加密通信的基础,Neo4j 支持多种证书类型和管理方式,以适应不同环境的需求。

证书类型

Neo4j 支持两种主要类型的证书,适用于不同的使用场景:

  1. 自签名证书

    • 由服务器自己签发,无需第三方验证
    • 生成简单,成本低廉
    • 安全性较低,客户端无法验证证书的真实性
    • 适用于开发和测试环境
  2. CA 签名证书

    • 由受信任的第三方证书颁发机构(CA)签发
    • 客户端可以通过验证 CA 签名来确认证书的真实性
    • 安全性较高,符合企业安全标准
    • 适用于生产环境

生成自签名证书

Neo4j 提供了内置工具 neo4j-admin 来生成自签名证书,操作简单方便:

bash
neo4j-admin dbms ssl self-signed --subject "CN=Neo4j Server, OU=Engineering, O=Neo4j, L=Stockholm, ST=Stockholm, C=SE" --keysize 2048 --duration 365

参数说明

  • --subject:证书主题,包含 CN(Common Name)、OU(组织单位)、O(组织)、L(城市)、ST(省份/州)、C(国家/地区)
  • --keysize:密钥长度,推荐使用 2048 位或更高
  • --duration:证书有效期,单位为天

配置 CA 签名证书

对于生产环境,强烈建议使用 CA 签名证书,以确保通信安全和可信度。配置步骤如下:

  1. 生成私钥和 CSR(证书签名请求)

    bash
    openssl req -newkey rsa:2048 -nodes -keyout neo4j.key -out neo4j.csr
  2. 将 CSR 发送给 CA 以获取签名证书

    • 可以选择公共 CA(如 Let's Encrypt、DigiCert 等)或企业内部 CA
    • CA 会验证您的身份并签发签名证书
  3. 将 CA 根证书、中间证书和服务器证书复制到 Neo4j 证书目录

    bash
    cp ca.crt /var/lib/neo4j/certificates/trusted/  # CA 根证书,用于验证证书链
    cp intermediate.crt /var/lib/neo4j/certificates/trusted/  # 中间证书(如果有)
    cp neo4j.crt /var/lib/neo4j/certificates/ssl/  # 服务器签名证书
    cp neo4j.key /var/lib/neo4j/certificates/ssl/  # 服务器私钥

注意事项

  • 确保证书文件的权限设置正确,只有 Neo4j 用户可以访问
  • 定期更新证书,避免使用过期证书
  • 保留证书的备份,以防证书丢失

客户端与服务器通信加密

客户端与服务器之间的通信加密是保护数据安全的重要环节。Neo4j 支持对 Bolt 和 HTTPS 协议进行 SSL/TLS 加密配置。

配置客户端连接加密

neo4j.conf 文件中,可以配置客户端连接的 SSL/TLS 加密参数。以下是基本配置示例:

txt
# 启用 Bolt 协议的 SSL 加密
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=REQUIRED
dbms.connector.bolt.listen_address=0.0.0.0:7687

# 启用 HTTPS 协议
dbms.connector.https.enabled=true
dbms.connector.https.listen_address=0.0.0.0:7473

# 证书位置
dbms.ssl.policy.bolt.base_directory=certificates/ssl
dbms.ssl.policy.bolt.private_key=private.key
dbms.ssl.policy.bolt.public_certificate=public.crt

dbms.ssl.policy.https.base_directory=certificates/ssl
dbms.ssl.policy.https.private_key=private.key
dbms.ssl.policy.https.public_certificate=public.crt

配置说明

  • dbms.connector.bolt.tls_level:设置 Bolt 协议的 TLS 级别,可选值包括 DISABLED、OPTIONAL、REQUIRED 和 ENFORCED
  • dbms.connector.bolt.listen_address:设置 Bolt 协议监听的地址和端口
  • dbms.ssl.policy.bolt.base_directory:指定 Bolt 协议使用的证书目录
  • dbms.ssl.policy.bolt.private_key:指定私钥文件名
  • dbms.ssl.policy.bolt.public_certificate:指定公钥证书文件名

客户端连接配置

客户端应用程序需要正确配置才能连接到启用了 SSL/TLS 加密的 Neo4j 数据库。以下是使用不同编程语言驱动连接的示例:

Java 驱动示例

java
// Java 驱动示例
Driver driver = GraphDatabase.driver("bolt+s://localhost:7687", AuthTokens.basic("neo4j", "password"));

Python 驱动示例

python
# Python 驱动示例
from neo4j import GraphDatabase

driver = GraphDatabase.driver("bolt+s://localhost:7687", auth=(":neo4j", "password"))

Node.js 驱动示例

javascript
// Node.js 驱动示例
const neo4j = require('neo4j-driver');

const driver = neo4j.driver(
    'bolt+s://localhost:7687',
    neo4j.auth.basic('neo4j', 'password')
);

连接字符串说明

  • bolt+s://:表示使用加密的 Bolt 协议
  • neo4j+s://:表示使用加密的 Neo4j 协议(同 Bolt)
  • https://:表示使用加密的 HTTPS 协议

注意事项

  • 确保客户端信任服务器证书,对于自签名证书,需要在客户端配置信任策略
  • 证书的 CN(Common Name)必须与服务器主机名匹配,否则会出现证书验证错误
  • 防火墙必须允许相应端口的通信(默认 Bolt 7687,HTTPS 7473)

集群通信加密

配置集群内部加密

neo4j.conf 中配置:

txt
# 启用集群通信加密
dbms.ssl.policy.cluster.enabled=true
dbms.ssl.policy.cluster.base_directory=certificates/cluster
dbms.ssl.policy.cluster.private_key=private.key
dbms.ssl.policy.cluster.public_certificate=public.crt
dbms.ssl.policy.cluster.trusted_dir=trusted
dbms.ssl.policy.cluster.client_auth=REQUIREDS
dbms.ssl.policy.cluster.tls_level=REQUIRED

# 集群通信使用加密策略
causal_clustering.ssl.policy=cluster

备份通信加密

配置备份加密

neo4j.conf 中配置:

txt
# 启用备份服务
dbms.backup.enabled=true
dbms.backup.listen_address=0.0.0.0:6362

# 配置备份 SSL 策略
dbms.ssl.policy.backup.enabled=true
dbms.ssl.policy.backup.base_directory=certificates/backup
dbms.ssl.policy.backup.private_key=private.key
dbms.ssl.policy.backup.public_certificate=public.crt
dbms.ssl.policy.backup.client_auth=OPTIONAL

dbms.backup.ssl.policy=backup

执行加密备份

bash
neo4j-admin backup --database=neo4j --backup-dir=/path/to/backup --protocol=ssl

TLS 级别配置

Neo4j 支持多种 TLS 级别:

  • DISABLED:不使用 TLS
  • OPTIONAL:客户端可以选择是否使用 TLS
  • REQUIRED:必须使用 TLS,但不验证证书
  • ENFORCED:必须使用 TLS 并验证证书

常见配置场景

场景 1:开发环境(自签名证书)

txt
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=OPTIONAL
dbms.connector.https.enabled=true

neo4j-admin dbms ssl self-signed --subject "CN=localhost, OU=Development, O=Neo4j, L=Stockholm, ST=Stockholm, C=SE"

场景 2:生产环境(CA 签名证书)

txt
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=ENFORCED
dbms.connector.https.enabled=true
dbms.connector.https.tls_level=ENFORCED

# 配置证书路径
dbms.ssl.policy.bolt.base_directory=certificates/ssl
dbms.ssl.policy.bolt.private_key=server.key
dbms.ssl.policy.bolt.public_certificate=server.crt
dbms.ssl.policy.bolt.trusted_dir=trusted

dbms.ssl.policy.https.base_directory=certificates/ssl
dbms.ssl.policy.https.private_key=server.key
dbms.ssl.policy.https.public_certificate=server.crt
dbms.ssl.policy.https.trusted_dir=trusted

验证 SSL/TLS 配置

检查 Bolt 连接

bash
openssl s_client -connect localhost:7687 -starttls bolt

检查 HTTPS 连接

bash
openssl s_client -connect localhost:7473

查看 Neo4j 日志

检查 neo4j.log 文件中是否有 SSL/TLS 相关的错误信息:

bash
tail -f /var/log/neo4j/neo4j.log | grep -i ssl

最佳实践

  1. 使用强密码算法:推荐使用 RSA 2048 位或更高密钥长度
  2. 定期更新证书:避免使用过期证书
  3. 限制证书访问权限:确保证书文件只有 Neo4j 用户可访问
    bash
    chown -R neo4j:neo4j /var/lib/neo4j/certificates/
    chmod 600 /var/lib/neo4j/certificates/*/*.key
  4. 在生产环境使用 CA 签名证书:避免使用自签名证书
  5. 启用证书验证:在生产环境中使用 ENFORCED TLS 级别

常见问题(FAQ)

Q1: 配置 SSL/TLS 后无法连接到数据库怎么办?

A1: 检查以下几点:

  • 证书是否有效且未过期
  • 证书的 CN(Common Name)是否与服务器主机名匹配
  • 客户端是否信任服务器证书
  • 防火墙是否允许相应端口的通信

Q2: 如何在集群环境中配置 SSL/TLS?

A2: 确保所有集群节点使用相同的 SSL 配置和信任的证书,建议使用统一的 CA 签名证书。

Q3: 自签名证书和 CA 签名证书有什么区别?

A3: 自签名证书由服务器自己签发,客户端无法验证其真实性;CA 签名证书由受信任的第三方机构签发,客户端可以验证其真实性,安全性更高。

Q4: 如何更新过期的证书?

A4: 生成新证书,替换旧证书文件,然后重启 Neo4j 服务。

Q5: 可以为不同的通信渠道使用不同的证书吗?

A5: 是的,Neo4j 支持为不同的通信渠道(客户端、集群、备份)配置不同的 SSL 策略和证书。