外观
Neo4j SSL/TLS 配置
配置文件位置
Neo4j 的 SSL/TLS 配置主要通过 neo4j.conf 文件进行管理,证书文件通常存储在 certificates/ 目录下。
证书管理
证书是 SSL/TLS 加密通信的基础,Neo4j 支持多种证书类型和管理方式,以适应不同环境的需求。
证书类型
Neo4j 支持两种主要类型的证书,适用于不同的使用场景:
自签名证书:
- 由服务器自己签发,无需第三方验证
- 生成简单,成本低廉
- 安全性较低,客户端无法验证证书的真实性
- 适用于开发和测试环境
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 签名证书,以确保通信安全和可信度。配置步骤如下:
生成私钥和 CSR(证书签名请求)
bashopenssl req -newkey rsa:2048 -nodes -keyout neo4j.key -out neo4j.csr将 CSR 发送给 CA 以获取签名证书
- 可以选择公共 CA(如 Let's Encrypt、DigiCert 等)或企业内部 CA
- CA 会验证您的身份并签发签名证书
将 CA 根证书、中间证书和服务器证书复制到 Neo4j 证书目录
bashcp 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 和 ENFORCEDdbms.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=sslTLS 级别配置
Neo4j 支持多种 TLS 级别:
DISABLED:不使用 TLSOPTIONAL:客户端可以选择是否使用 TLSREQUIRED:必须使用 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最佳实践
- 使用强密码算法:推荐使用 RSA 2048 位或更高密钥长度
- 定期更新证书:避免使用过期证书
- 限制证书访问权限:确保证书文件只有 Neo4j 用户可访问bash
chown -R neo4j:neo4j /var/lib/neo4j/certificates/ chmod 600 /var/lib/neo4j/certificates/*/*.key - 在生产环境使用 CA 签名证书:避免使用自签名证书
- 启用证书验证:在生产环境中使用
ENFORCEDTLS 级别
常见问题(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 策略和证书。
