SSL 框架
SSL 框架支持使用标准 SSL/TLS 技术保护以下 Neo4j 通信通道:
-
bolt
(端口 -7687
) -
https
(端口 -7473
) -
cluster
(端口 -6000
,7000
, 和7688
)
请注意,从 Neo4j 2025.01 开始,不再使用端口5000
。 -
backups
(端口 -6362
)
本页介绍如何在您的环境中设置 SSL,以及如何查看、验证和测试证书。
SSL 提供程序
Neo4j 中的安全网络通过 Netty 库提供,该库支持本机 JDK SSL 提供程序以及 Netty 支持的 OpenSSL 派生版本。每个 Neo4j 版本都附带一个 Netty 版本,并且 Netty 需要特定版本的 netty-tcnative
库以实现兼容性,该库可以在 Neo4j 安装的 lib/
目录中找到。2025.01.0 附带 Netty 2.0.69.Final,需要 netty-tcnative-boringssl-static-2.0.69.Final。
使用 tcnative 的动态版本需要安装平台特定的依赖库,如 https://netty.java.net.cn/wiki/forked-tomcat-native.html 所述。 在大多数使用情况下, |
请按照以下步骤使用 OpenSSL
-
将合适的
netty-tcnative
依赖项安装到 Neo4j 的plugins/
目录中。您需要哪个netty-tcnative
版本取决于您的操作系统和架构。 -
设置
dbms.netty.ssl.provider=OPENSSL
。使用 OpenSSL 可以显著提高性能,特别是对于 AES-GCM-cryptos,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 -
重启 Neo4j。
证书和私钥
证书
可以使用 Let's Encrypt 等非营利性 CA 免费生成有效的受信任证书。 |
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJTRTEQ
...
xsUBvcQuyxewlvWRS18YB51J+yu0Xg==
-----END CERTIFICATE-----
本页上的说明假设您已经从 CA 获取了所需的证书并将其添加到 public.crt 文件中。为此,您应该连接每个 PEM 编码的证书,从叶证书开始并向上移动到根。
如果集群的所有实例都使用相同的证书,请确保在生成证书时所有集群实例的 DNS 名称都包含在证书中。还支持多主机和通配符证书。 |
如果将集群内加密设置为集群配置的一部分,请确保集群端点上使用的证书支持服务器和客户端使用。这是因为当服务器连接以形成集群时,每个服务器都使用自己的证书作为客户端在连接到另一个服务器时进行身份验证。 这可以在证书详细信息中验证 openssl x509 -in public.crt -noout -text 您应该看到 X509v3 扩展密钥使用部分显示了列出的两种用法 X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication |
私钥
私钥必须采用标准格式 PKCS #8 并保存为 PEM 编码
文件。
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAN5D0I4bgdQK4In6
...
oaMe91ZPQ1JI
-----END PRIVATE KEY-----
私钥也可以根据 PKCS #5 标准用密码加密。
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICojAcBgoqhkiG9w0BDAEEMA4ECL3eSAoRlJ18AgIIAASCAoCj7WDyjsgcawdv
...
lYeSjVah
-----END ENCRYPTED PRIVATE KEY-----
转换
如果私钥使用旧的 PKCS #1 格式编码,文件通常以行开头
-----BEGIN RSA PRIVATE KEY-----
您可以使用以下命令将其转换为 PKCS #8 格式
openssl pkcs8 -topk8 -in pkcs1.key -out pkcs8.key
未加密的私钥可以是 PKCS #1 或 PKCS #8。可以使用以下命令对其进行加密
openssl pkcs8 -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA512 -in pkcs1or8.key -out pkcs8.encrypted.key
-
-v2 aes-128-cbc -v2prf hmacWithSHA1
-
-v2 aes-128-cbc -v2prf hmacWithSHA224
-
-v2 aes-128-cbc -v2prf hmacWithSHA256
-
-v2 aes-128-cbc -v2prf hmacWithSHA384
-
-v2 aes-128-cbc -v2prf hmacWithSHA512
-
-v2 aes-256-cbc -v2prf hmacWithSHA224
-
-v2 aes-256-cbc -v2prf hmacWithSHA256
-
-v2 aes-256-cbc -v2prf hmacWithSHA384
-
-v2 aes-256-cbc -v2prf hmacWithSHA512
Neo4j 5.0 之前的版本允许密钥使用旧的 PKCS #1 标准存储。您可以通过文件开头的 |
网络连接器
在启用 SSL 支持之前,您必须确保以下网络连接器配置以避免错误
-
使用 HTTPS 时,将
server.https.enabled
设置为true
。 -
使用 Bolt 时,将
server.bolt.tls_level
设置为REQUIRED
或OPTIONAL
。
有关配置网络连接器的更多信息,请参阅 配置网络连接器。
配置
SSL 策略通过将值分配给以下格式的参数进行配置
dbms.ssl.policy.<scope>.<setting-suffix>
-
scope
是通信通道的名称,例如bolt
、https
、cluster
和backup
。 -
setting-suffix
可以是以下任何一个设置后缀 描述 默认值 基本
enabled
将其设置为
true
可启用此策略。false
base_directory
默认情况下搜索 加密对象 的基本目录。
certificates/<scope>
private_key
用于验证和保护此实例的私钥。
private.key
private_key_password
用于解码私钥的密码短语。仅适用于加密的私钥。
public_certificate
由 CA 签署的与私钥匹配的公共证书。
public.crt
trusted_dir
填充有受信任方证书的目录。
trusted/
revoked_dir
填充有证书吊销列表 (CRL) 的目录。
revoked/
高级
verify_hostname
[1]此设置启用客户端主机名验证。在接收到服务器的公共证书后,客户端将其使用的地址与证书通用名称 (CN) 和主题备用名称 (SAN) 字段进行比较。如果地址与这些字段不匹配,客户端将断开连接。
true
ciphers
在密码协商期间允许的密码套件的逗号分隔列表。有效值取决于当前的 JRE、SSL 提供程序和 TLS 版本。有关 Oracle JRE 支持的密码,请参阅 Oracle 官方文档。
Java 平台默认允许的密码套件。
tls_versions
允许的 TLS 版本的逗号分隔列表。默认情况下只允许 TLSv1.2 和 TLSv1.3。要同时使用 TLSv1.2 和 TLSv1.3 版本,您必须指定每个版本要强制执行的密码。否则,Neo4j 可能会使用 JVM 中所有可能的密码,从而导致安全性较低的配置。
TLSv1.2
TLSv1.3
client_auth
客户端是否必须进行身份验证。将其设置为
REQUIRE
可为服务器启用相互身份验证。其他可能的值是NONE
和OPTIONAL
。bolt
和https
为OPTIONAL
;
cluster
和backup
为REQUIRE
。trust_all
将其设置为
true
会导致所有客户端和服务器都受到信任,并且trusted_dir
目录的内容被忽略。仅将其用作调试手段,因为它不提供安全性。false
1. 在 Neo4j 2025.01 中,默认值从
false
更改为true
。
出于安全原因,Neo4j 不会自动创建这些目录。因此,创建 SSL 策略需要手动设置适当的文件系统结构。请注意,目录、证书文件和私钥的存在是强制性的。确保只有 Neo4j 用户才能读取私钥。 |
每个策略都需要通过设置 dbms.ssl.policy.<scope>.enabled=true
来明确启用。
通过 Bolt 配置 SSL
Bolt 协议基于 PackStream 序列化,并支持 Cypher 类型系统、协议版本控制、身份验证和通过证书的 TLS。对于 Neo4j 集群,Bolt 通过负载平衡和故障转移提供智能客户端路由。当启用服务器端路由时,会在 7688
上打开一个额外的 Bolt 端口。它只能在集群内使用,并且与外部 Bolt 端口具有所有相同的设置。
Bolt 连接器由 Cypher Shell、Neo4j Browser 和官方支持的语言驱动程序使用。Bolt 连接器默认启用,但其加密已禁用。要启用 Bolt 上的加密,请创建文件夹结构并将密钥文件和证书放置在其中。然后,您需要配置 neo4j.conf 文件中的 SSL Bolt 策略。
-
启用 Bolt 连接器以在 Bolt 上启用 SSL
server.bolt.enabled=true (default is true)
-
在 certificates 下设置 bolt 文件夹。
-
在 <NEO4J_HOME>/certificates 文件夹下创建 bolt 目录
mkdir certificates/bolt
-
在 <NEO4J_HOME>/certificates/bolt 文件夹下创建 trusted 和 revoked 目录
mkdir certificates/bolt/trusted mkdir certificates/bolt/revoked
-
-
将证书 private.key 和 public.crt 文件放置在 <NEO4J_HOME>/certificates/bolt 文件夹下
cp /path/to/certs/private.key certificates/bolt cp /path/to/certs/public.crt certificates/bolt
-
将 public.crt 文件放置在 <NEO4J_HOME>/certificates/bolt/trusted 文件夹下。
cp /path/to/certs/public.crt certificates/bolt/trusted
-
(可选)如果特定证书被吊销,则将其放置在 <NEO4J_HOME>/certificates/bolt/revoked 文件夹下。
cp /path/to/certs/public.crt certificates/bolt/revoked
文件夹结构应如下所示,具有正确的文件权限、组和所有权
路径 目录/文件 所有者 组 权限 Unix/Linux 视图 /data/neo4j/certificates/bolt
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/bolt/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/bolt/private.key
文件
neo4j
neo4j
0400
-r--------
/data/neo4j/certificates/bolt/trusted
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/bolt/trusted/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/bolt/revoked
目录
neo4j
neo4j
0755
drwxr-xr-x
所有者/组应配置为将运行
neo4j
服务的用户/组。默认用户/组是 neo4j/neo4j。 -
在 neo4j.conf 中设置 Bolt SSL 配置。
-
将 SSL Bolt 策略设置为
true
dbms.ssl.policy.bolt.enabled=true
-
设置适当的证书路径和正确的密钥和证书文件
dbms.ssl.policy.bolt.base_directory=certificates/bolt dbms.ssl.policy.bolt.private_key=private.key dbms.ssl.policy.bolt.public_certificate=public.crt
如果证书在 NEO4J_HOME 之外的不同路径下,则设置证书目录的绝对路径。
-
将 Bolt 客户端身份验证设置为
NONE
以禁用相互身份验证dbms.ssl.policy.bolt.client_auth=NONE
-
设置 Bolt TLS 级别以允许连接器接受加密和/或未加密连接
server.bolt.tls_level=REQUIRED (default is DISABLED)
REQUIRED
表示连接器只接受加密的客户端连接并拒绝未加密的连接。OPTIONAL
表示连接器接受加密或未加密的客户端连接。
-
-
测试到指定主机和 Bolt 端口的 SSL 连接并查看证书
openssl s_client -connect my_domain.com:7687
通过 Bolt 使用 SSL 连接
每个 neo4j
和 bolt
URI 方案都允许包含额外加密和信任信息的变体。+s
变体启用带完整证书检查的加密。+ssc
变体启用不带证书检查的加密。后一种变体专门设计用于自签名证书。
URI 方案 | 路由 | 描述 |
---|---|---|
|
是 |
未加密 |
|
是 |
使用完整证书保护 |
|
是 |
使用自签名证书保护 |
|
否 |
未加密 |
|
否 |
使用完整证书保护 |
|
否 |
使用自签名证书保护 |
一旦 Bolt 上启用了 SSL,您就可以使用 neo4j+s
或 bolt+s
连接到 Neo4j DBMS
- Cypher Shell
cypher-shell -a neo4j+s://<Server DNS or IP>:<Bolt port>
or
cypher-shell -a bolt+s://<Server DNS or IP>:<Bolt port>
通过 HTTPS 配置 SSL
HTTP(s) 由 Neo4j Browser 和 HTTP API 使用。HTTPS(安全 HTTP)用于加密网络通信。要启用 HTTPS 上的加密,请创建文件夹结构并将密钥文件和证书放置在其中。然后,您需要在 neo4j.conf 文件中配置 SSL HTTPS 策略并禁用 HTTP 连接器。
HTTPS 配置要求同时设置 Bolt。有关更多说明,请参阅 通过 Bolt 配置 SSL。 |
-
启用 HTTPS 连接器以在 HTTPS 上启用 SSL
server.https.enabled=true (default is false)
-
在 certificates 下设置 https 文件夹。
-
在 <NEO4J_HOME>/certificates 文件夹下创建 https 目录
mkdir certificates/https
-
在 <NEO4J_HOME>/certificates/https 文件夹下创建 trusted 和 revoked 目录
mkdir certificates/https/trusted mkdir certificates/https/revoked
-
-
将证书 private.key 和 public.crt 文件放置在 <NEO4J_HOME>/certificates/https 文件夹下
cp /path/to/certs/private.key certificates/https cp /path/to/certs/public.crt certificates/https
-
将 public.crt 文件放置在 <NEO4J_HOME>/certificates/https/trusted 文件夹下。
cp /path/to/certs/public.crt certificates/https/trusted
-
(可选)如果特定证书被吊销,则将其放置在 <NEO4J_HOME>/certificates/https/revoked 文件夹下。
cp /path/to/certs/public.crt certificates/https/revoked
文件夹结构应如下所示,具有正确的文件权限、组和所有权
路径 目录/文件 所有者 组 权限 Unix/Linux 视图 /data/neo4j/certificates/https
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/https/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/https/private.key
文件
neo4j
neo4j
0400
-r--------
/data/neo4j/certificates/https/trusted
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/https/trusted/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/https/revoked
目录
neo4j
neo4j
0755
drwxr-xr-x
所有者/组应配置为将运行
neo4j
服务的用户/组。默认用户/组是 neo4j/neo4j。 -
在 neo4j.conf 中设置 HTTPS SSL 配置。
-
将 SSL HTTPS 策略设置为
true
dbms.ssl.policy.https.enabled=true
-
设置适当的证书路径和正确的密钥和证书文件
dbms.ssl.policy.https.base_directory=certificates/https dbms.ssl.policy.https.private_key=private.key dbms.ssl.policy.https.public_certificate=public.crt
如果证书在 NEO4J_HOME 之外的不同路径下,则设置证书目录的绝对路径。
-
将 HTTPS 客户端身份验证设置为
NONE
以禁用相互身份验证dbms.ssl.policy.https.client_auth=NONE
-
禁用 HTTP 连接器
server.http.enabled=false
-
-
测试到指定主机和 HTTPS 端口的 SSL 连接并查看证书
openssl s_client -connect my_domain.com:7473
配置集群内通信的 SSL
集群内加密是集群通信的安全解决方案。Neo4j 集群在 3 个端口上进行通信
-
6000 - 事务
-
7000 - Raft 通信
-
7688 - 服务器端路由
要设置集群内加密,请在每个服务器上创建文件夹结构并将密钥文件和证书放置在其中。然后,您需要在 neo4j.conf 文件中配置 SSL 集群策略并测试集群内通信是否已加密。
-
在 certificates 下设置 cluster 文件夹。
-
在 <NEO4J_HOME>/certificates 文件夹下创建 cluster 目录
mkdir certificates/cluster
-
在 <NEO4J_HOME>/certificates/cluster 文件夹下创建 trusted 和 revoked 目录
mkdir certificates/cluster/trusted mkdir certificates/cluster/revoked
-
-
将证书 private.key 和 public.crt 文件放置在 <NEO4J_HOME>/certificates/cluster 文件夹下
cp /path/to/certs/private.key certificates/cluster cp /path/to/certs/public.crt certificates/cluster
-
将 public.crt 文件放置在 <NEO4J_HOME>/certificates/cluster/trusted 文件夹下。
cp /path/to/certs/public.crt certificates/cluster/trusted
如果每个服务器都有一个由 CA 签名的自己的证书,那么每个服务器的公共证书都必须放在集群的每个实例上的 trusted 文件夹中。因此,服务器能够相互建立信任关系。
-
(可选)如果特定证书被吊销,则将其放置在 <NEO4J_HOME>/certificates/cluster/revoked 文件夹下。
cp /path/to/certs/public.crt certificates/cluster/revoked
文件夹结构应如下所示,具有正确的文件权限、组和所有权
路径 目录/文件 所有者 组 权限 Unix/Linux 视图 /data/neo4j/certificates/cluster
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/cluster/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/cluster/private.key
文件
neo4j
neo4j
0400
-r--------
/data/neo4j/certificates/cluster/trusted
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/cluster/trusted/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/cluster/revoked
目录
neo4j
neo4j
0755
drwxr-xr-x
所有者/组应配置为将运行
neo4j
服务的用户/组。默认用户/组是 neo4j/neo4j。 -
在 neo4j.conf 中设置集群 SSL 配置。
-
将集群 SSL 策略设置为
true
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
如果证书在 NEO4J_HOME 之外的不同路径下,则设置证书目录的绝对路径。
-
将集群客户端身份验证设置为
REQUIRE
以启用相互身份验证,这意味着通道的两端都必须进行身份验证dbms.ssl.policy.cluster.client_auth=REQUIRE
策略必须在每个服务器上配置相同的设置。实际安装的 加密对象 大多数会不同,因为它们不共享相同的私钥和相应的证书。但是,受信任的 CA 证书将共享。
-
验证集群内通信是否已加密。您可以使用外部工具,例如 Nmap (https://nmap.org/download.html)
nmap --script ssl-enum-ciphers -p <port> <hostname>
主机名和端口必须根据您的配置进行调整。这可以证明 TLS 已启用,并且只启用了预期的密码套件。应测试所有服务器和所有适用的端口。如果启用了集群内加密,输出应指示端口已打开,并且它正在使用 TLS 和所使用的密码。
-
有关保护集群服务器之间通信的更多详细信息,请参阅 集群内加密。 |
配置备份通信的 SSL
在单个实例中,备份通信默认在端口 6362
上进行。在集群拓扑中,可以从任何服务器进行备份,并且每个服务器都有两个可配置的端口能够提供备份。这些端口分别由 dbms.backup.listen.address
(端口 6362
) 和 server.cluster.listen_address
(端口 6000
) 配置。如果启用了集群内加密且备份通信使用端口 6000
,则您的通信通道已加密。以下步骤假设您的备份在不同的端口上设置。
要为备份通信设置 SSL,请创建文件夹结构并将密钥文件和证书放置在其中。然后,您需要在 neo4j.conf 文件中配置 SSL 备份策略。
-
在 certificates 下设置 backup 文件夹。
-
在 <NEO4J_HOME>/certificates 文件夹下创建 backup 目录
mkdir certificates/backup
-
在 <NEO4J_HOME>/certificates/backup 文件夹下创建 trusted 和 revoked 目录
mkdir certificates/backup/trusted mkdir certificates/backup/revoked
-
-
将证书 private.key 和 public.crt 文件放置在 <NEO4J_HOME>/certificates/backup 文件夹下
cp /path/to/certs/private.key certificates/backup cp /path/to/certs/public.crt certificates/backup
-
将 public.crt 文件放置在 <NEO4J_HOME>/certificates/backup/trusted 文件夹下。
cp /path/to/certs/public.crt certificates/backup/trusted
-
(可选)如果特定证书被吊销,则将其放置在 <NEO4J_HOME>/certificates/backup/revoked 文件夹下。
cp /path/to/certs/public.crt certificates/backup/revoked
文件夹结构应如下所示,具有正确的文件权限、组和所有权
路径 目录/文件 所有者 组 权限 Unix/Linux 视图 /data/neo4j/certificates/backup
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/backup/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/backup/private.key
文件
neo4j
neo4j
0400
-r--------
/data/neo4j/certificates/backup/trusted
目录
neo4j
neo4j
0755
drwxr-xr-x
/data/neo4j/certificates/backup/trusted/public.crt
文件
neo4j
neo4j
0644
-rw-r—r--
/data/neo4j/certificates/backup/revoked
目录
neo4j
neo4j
0755
drwxr-xr-x
所有者/组应配置为将运行
neo4j
服务的用户/组。默认用户/组是 neo4j/neo4j。 -
在 neo4j.conf 中设置备份 SSL 配置。
-
将备份 SSL 策略设置为
true
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
如果证书在 NEO4J_HOME 之外的不同路径下,则设置证书目录的绝对路径。
-
将备份客户端身份验证设置为
REQUIRE
以启用相互身份验证,这意味着通道的两端都必须进行身份验证dbms.ssl.policy.backup.client_auth=REQUIRE
-
SSL 的其他配置
使用加密私钥
要使用加密的私钥,请配置以下设置。私钥密码必须是明文格式,不带任何引号。
dbms.ssl.policy.bolt.private_key_password=<clear text password>
dbms.ssl.policy.https.private_key_password=<password>
dbms.ssl.policy.cluster.private_key_password=<password>
dbms.ssl.policy.backup.private_key_password=<password>
如果由于安全限制而无法硬编码明文私钥密码,则可以按照以下步骤设置为使用动态密码获取
-
创建一个包含私钥密码的
cleartext
密码文件,并使用证书对其进行加密(假设证书的私钥已设置密码且证书位于pwd
中)echo "password123" > passwordfile base64 -w 0 certificate.crt | openssl aes-256-cbc -a -salt -in passwordfile -out password.enc -pass stdin
删除密码文件并将
password.enc
的文件权限设置为400
(例如chmod 400 password.enc
)。 -
验证是否可以从 password.enc 读取加密密码
base64 -w 0 certificate.crt | openssl aes-256-cbc -a -d -in password.enc -pass stdin
-
设置 neo4j.conf
dbms.ssl.policy.<type>.private_key_password
以便能够读取加密密码。要调整证书和加密密码文件的路径,请使用完整路径dbms.ssl.policy.bolt.private_key_password=$(base64 -w 0 certificate.crt | openssl aes-256-cbc -a -d -in password.enc -pass stdin)
使用动态命令需要使用 |
使用特定密码
在某些情况下,Neo4j Enterprise 要求使用特定密码进行加密。可以通过指定在密码协商期间允许的密码套件列表来设置 Neo4j 配置。有效值取决于当前的 JRE 和 SSL 提供程序。对于 Oracle JRE,此处是支持列表 - https://docs.oracle.com/en/java/javase/21/docs/specs/security/standard-names.html#jsse-cipher-suite-names。
请注意,2025.01 版本不支持 CBC(密码块链)基于密码(RFC 8447),用于 TLS v1.2 网络加密。有关更多信息,请参阅 Neo4j 2025.x 中的变更、弃用和移除。
dbms.ssl.policy.bolt.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
dbms.ssl.policy.https.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
SSL 日志
所有与 SSL 相关的信息都可以在 debug.log 文件中找到。您还可以通过将以下配置添加到 neo4j.conf 文件并重启 Neo4j 来启用 SSL 的额外调试日志记录。
server.jvm.additional=-Djavax.net.debug=ssl:handshake
这会在 neo4j.log 文件中记录额外信息。在某些安装中,例如基于 RPM 的安装,不会创建 neo4j.log。要获取此内容,由于 neo4j.log 只包含 STDOUT
内容,请使用 journalctl
查找 neo4j
服务日志内容
neo4j@ubuntu:/var/log/neo4j$ journalctl -u neo4j -b > neo4j.log
neo4j@ubuntu:/var/log/neo4j$ vi neo4j.log
请注意,SSL 调试选项每次客户端通过 SSL 连接时都会记录一条新语句,这会使 neo4j.log 迅速增大。为避免这种情况,请确保此设置仅在短期内启用。 |
证书轮换
使用期限合理的证书被认为是最佳实践。然而,这需要定期轮换证书,即移除旧证书并安装新证书。以前的 Neo4j 版本需要重启数据库才能应用更改。从 2025.03 开始,可以轮换新证书,并且无需重启即可更新 SSL 配置。这减少了集群成员瞬时丢失的不良影响。
以下步骤概述了证书轮换的过程。
-
在所有集群成员上启用证书的动态重新加载。最好在部署集群时执行此操作,因为更改此配置需要重新启动
dbms.security.tls_reload_enabled=true (default is false)
-
通过覆盖文件系统上的旧证书或将其复制到新位置来替换旧证书。
请记住,如果您选择将证书复制到新目录或使用不同的文件名,则必须动态更新 SSL 策略设置。如果您正在原地覆盖证书并且不更改任何其他内容,则无需动态更新 SSL 策略设置。
新旧证书可以共存于文件系统中,但配置中只能引用一个。
需要将新证书复制到所有集群成员。 -
对任何 SSL 配置进行必要的更改和/或替换受影响范围的证书。
-
使用
bolt
URI 方案 连接到每个集群成员(依次进行),并运行重新加载过程dbms.security.reloadTLS()
-
新设置将立即生效;但是,现有连接不会被抢先终止。这意味着新连接将使用新证书,而现有连接(在更新之前建立)将继续使用旧证书。即使证书过期,活动连接也不会受到影响,因为证书仅在初始连接握手期间使用。
-
使用 配置集群内通信的 SSL 中描述的外部工具(例如 Nmap)验证集群内通信是否仍已加密。
术语
以下术语与 Neo4j 中的 SSL 支持相关
- 证书颁发机构 (CA)
-
一个受信任的实体,负责颁发可以验证数字实体身份的电子文档。该术语通常指全球认可的 CA,但也可以包括组织内部受信任的内部 CA。电子文档是数字 证书。它们是安全通信的重要组成部分,并在 公钥基础设施 中发挥重要作用。
- 证书吊销列表 (CRL)
-
如果证书被泄露,则可以吊销该证书。这是通过一个列表(位于一个或多个文件中)来完成的,该列表明确列出了哪些证书已被吊销。CRL 始终由颁发相应证书的 CA 颁发。
- 密码
-
执行加密或解密的算法。在加密通信的最通用实现中,Neo4j 隐式使用了作为 Java 平台一部分的密码。SSL 框架的配置也允许显式声明允许的密码。
- 通信通道
-
与 Neo4j 数据库通信的方式。可用通道有
-
Bolt 客户端流量
-
HTTPS 客户端流量
-
集群内通信
-
备份流量
-
- 加密对象
- 配置参数
-
这些是在 neo4j.conf 中为特定 SSL 策略 定义的参数。
- 证书
-
SSL 证书由受信任的 证书颁发机构 (CA) 颁发。公钥可以由任何人获取并用于加密发送给特定收件人的消息。证书通常存储在名为 <file name>.crt 的文件中。这也被称为 公钥。
- SAN
-
SAN 是 Subject Alternative Names 的缩写。它是证书的可选扩展。当提供包含 SAN 条目的证书时,建议根据此字段检查主机地址。验证主机名是否与证书 SAN 匹配有助于防止恶意机器访问有效密钥对的攻击。
- SSL
-
SSL 是 Secure Sockets Layer 的缩写,是 TLS 的前身。通常将 SSL/TLS 统称为 SSL。然而,现代和安全的版本是 TLS,这也是 Neo4j 中的默认版本。
- SSL 策略
-
Neo4j 中的 SSL 策略包括 数字证书 和 neo4j.conf 中定义的一组配置参数。
- PKCS #1
-
PKCS #1 是公钥密码学标准 (PKCS) 的第一个系列标准。它提供了实现 RSA 算法进行公钥密码学的基础定义和建议。它定义了公钥和私钥的数学属性、加密和签名的原始操作、安全密码学方案以及相关的 ASN.1 语法表示。
- PKCS #5
-
PKCS #5 包含密码学实现建议,涵盖密钥派生函数、加密方案、消息认证方案和 ASN.1 语法,并识别了相关技术。
- PKCS #8
-
PKCS #8 是存储私钥信息的标准语法。PKCS #8 私钥可以使用支持多种密码的 PKCS #5 标准加密。与 PKCS #1 的主要区别在于,它允许更多算法而不是 RSA,并支持更强的私钥加密。
- 私钥
-
私钥确保加密消息只能由预期的接收者解密。私钥通常存储在名为 <file name>.key 的文件中。保护私钥对于确保加密通信的完整性至关重要。
- 公钥基础设施 (PKI)
- 公钥
-
公钥可以由任何人获取并用于加密发送给特定收件人的消息。这也被称为 证书。
- TLS 协议
-
在计算机网络上提供通信安全的加密协议。传输层安全 (TLS) 协议及其前身安全套接层 (SSL) 协议都经常被称为“SSL”。
- TLS 版本
-
TLS 协议的一个版本。
- X.509
-
X.509 是国际电信联盟 (ITU) 标准,定义了 公钥 证书的格式。