SSL 框架
SSL 框架提供支持,可以使用标准 SSL/TLS 技术保护以下 Neo4j 通信通道。
-
bolt
(端口 -7687
) -
https
(端口 -7473
) -
cluster
(端口 -5000
、6000
、7000
和7688
) -
backups
(端口 -6362
)
此页面介绍如何在您的环境中设置 SSL,以及如何查看、验证和测试证书。
从 Neo4j 5.23 开始,弃用使用端口 |
SSL 提供程序
Neo4j 的安全网络通过 Netty 库提供,该库支持原生 JDK SSL 提供程序以及 Netty 支持的 OpenSSL 派生程序。每个版本的 Neo4j 都附带一个 Netty 版本,并且 Netty 需要特定版本的 `netty-tcnative` 库才能兼容。
使用 OpenSSL 的步骤如下:
-
将合适的 `netty-tcnative` 依赖项安装到 Neo4j 的 `plugins/` 目录中。
-
依赖项可以从 https://netty.java.net.cn/wiki/forked-tomcat-native.html 下载。
-
您需要的 `netty-tcnative` 版本取决于 Neo4j 版本。有关版本详细信息,请参阅 每个 Neo4j 版本的 Netty 支持 表格。请确保安装与您的操作系统和架构匹配的构建变体。
-
-
设置 `dbms.netty.ssl.provider=OPENSSL`。
-
重启 Neo4j。
使用 `tcnative` 的动态版本将需要安装平台特定的依赖库,如 https://netty.java.net.cn/wiki/forked-tomcat-native.html 中所述。 在大多数用例中,静态链接的 `netty-tcnative` 的 `boringssl` 变体足以启用 SSL 加密。 |
下表显示了支持的 Neo4j 版本的信息。
下表列出了 Neo4j 中更新 `netty-tcnative` 依赖项的时间。
如果未列出 Neo4j 版本,请使用表中列出的下一个最早的 Neo4j 版本的条目。 例如:对于 Neo4j 5.15.0,表中列出的下一个最早版本是 5.10,因此所需的 `netty-tcnative` 版本为 `2.0.61.Final`。 |
Neo4j 版本 | tcnative 版本 | 直接链接 |
---|---|---|
5.23 |
2.0.65.Final。仅需要 netty-tcnative-boringssl-static。 |
|
5.20 |
2.0.65.Final。需要 netty-tcnative-boringssl-static 和 netty-tcnative-classes。 |
netty-tcnative-boringssl-static-2.0.65.Final netty-tcnative-classes-2.0.65.Final |
5.10 |
2.0.61.Final。需要 netty-tcnative-boringssl-static 和 netty-tcnative-classes。 |
netty-tcnative-boringssl-static-2.0.61.Final netty-tcnative-classes-2.0.61.Final |
5.8 |
2.0.60.Final。需要 netty-tcnative-boringssl-static 和 netty-tcnative-classes。 |
netty-tcnative-boringssl-static-2.0.60.Final netty-tcnative-classes-2.0.60.Final |
5.5 |
2.0.56.Final。需要 netty-tcnative-boringssl-static 和 netty-tcnative-classes。 |
netty-tcnative-boringssl-static-2.0.56.Final netty-tcnative-classes-2.0.56.Final |
5.1 |
2.0.54.Final。需要 netty-tcnative-boringssl-static 和 netty-tcnative-classes。 |
netty-tcnative-boringssl-static-2.0.54.Final netty-tcnative-classes-2.0.54.Final |
使用 OpenSSL 可以显著提高性能,尤其是在 AES-GCM 加密方面,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 |
证书和私钥
证书
可以使用非盈利性 CA(如 Let’s Encrypt)免费生成有效的受信任证书。 |
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJTRTEQ
...
xsUBvcQuyxewlvWRS18YB51J+yu0Xg==
-----END CERTIFICATE-----
此页面上的说明假设您已从 CA 获取所需的证书并将其添加到 public.crt 文件中。为此,您应该连接每个 PEM 编码的证书,从叶子证书开始,向上移动到根证书。
如果在集群的所有实例中使用相同的证书,请确保在生成证书时在证书中包含所有集群实例的 DNS 名称。也支持多主机和通配符证书。 |
如果将集群配置的一部分设置为集群内加密,请确保集群端点上使用的证书支持服务器和客户端使用。这是因为当在 Neo4j 服务器之间进行集群连接时,每个服务器都使用自己的证书在连接到另一台服务器时进行客户端身份验证。 这可以通过证书详细信息进行验证。 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 标准存储密钥。您可以通过文件开头的行 `-----BEGIN RSA PRIVATE KEY-----` 来识别它们。虽然 Neo4j 5.0 可以加载和使用这些密钥,但它们被视为已弃用,将在未来的版本中删除。 |
连接器
在启用 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
启用此设置将开启客户端主机名验证。在收到服务器的公钥证书后,客户端会将它使用的地址与证书的通用名称 (CN) 和主题备用名称 (SAN) 字段进行比较。如果地址与这些字段不匹配,客户端将断开连接。
false
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
从 Neo4j 5.24 开始支持client_auth
客户端是否必须进行身份验证。将其设置为 `REQUIRE` 可为服务器启用双向身份验证。其他可能的值为 `NONE` 和 `OPTIONAL`。
`OPTIONAL` 用于 `bolt` 和 `https`;
`REQUIRE` 用于 `cluster` 和 `backup`。trust_all
将其设置为 `true` 将导致所有客户端和服务器都受信任,并且 `trusted_dir` 目录的内容将被忽略。仅将其用作调试方法,因为它不提供安全性。
false
出于安全原因,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)
在 Neo4j 3.5 版本中,默认值为
OPTIONAL
。在 Neo4j 4.x 版本中,默认值为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>
- Neo4j 浏览器
-
从连接 URL下拉菜单中,选择要使用的 URI 方案(
neo4j+s
或bolt+s
)。以
+ssc
结尾的 URI 方案不受 Neo4j Browser 支持,因为浏览器的操作系统处理证书信任。如果需要使用来自 Neo4j Browser 的自签名证书连接到 Neo4j 实例,请首先访问使用自签名证书的网页,以提示浏览器请求授予该证书信任。授予该信任后,您可以使用以+s
结尾的 URI 方案进行连接。
配置 HTTPS 上的 SSL
Neo4j Browser 和 HTTP API 使用 HTTP(s)。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 集群在 4 个端口上进行通信
-
5000 - 发现管理
-
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/17/docs/specs/security/standard-names.html#jsse-cipher-suite-names。
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中的SSL支持相关
- 证书颁发机构 (CA)
-
一个可信实体,它颁发可以验证数字实体身份的电子文档。该术语通常指全球公认的CA,但也包括组织内部可信的内部CA。电子文档是数字证书。它们是安全通信的重要组成部分,并在公钥基础设施中发挥着重要作用。
- 证书吊销列表 (CRL)
-
如果证书遭到泄露,则可以吊销该证书。这是通过一个列表(位于一个或多个文件中)来完成的,该列表列出了哪些证书被吊销。CRL始终由颁发相应证书的CA颁发。
- 密码
-
执行加密或解密的算法。在加密通信的最通用实现中,Neo4j隐式使用作为Java平台一部分包含的密码。SSL框架的配置还允许显式声明允许的密码。
- 通信通道
-
与Neo4j数据库通信的一种方式。可用的通道包括
-
Bolt客户端流量
-
HTTPS客户端流量
-
集群内通信
-
备份流量
-
- 加密对象
- 配置参数
-
这些是在neo4j.conf中为特定ssl策略定义的参数。
- 证书
-
SSL证书由可信的证书颁发机构 (CA)颁发。任何人都可以获取公钥并将其用于加密发送给特定接收者的消息。证书通常存储在名为<文件名>.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更多的算法并支持更强大的私钥加密。
- 私钥
-
私钥确保只有预期的接收者才能解密加密的消息。私钥通常存储在名为<文件名>.key的文件中。保护私钥以确保加密通信的完整性非常重要。
- 公钥基础设施 (PKI)
- 公钥
-
任何人都可以获取公钥并将其用于加密发送给特定接收者的消息。这也称为证书。
- TLS协议
-
提供计算机网络通信安全的加密协议。传输层安全性 (TLS) 协议及其前身安全套接字层 (SSL) 协议都经常被称为“SSL”。
- TLS版本
-
TLS协议的版本。
- X.509
-
X.509是国际电信联盟 (ITU) 的标准,定义了公钥证书的格式。