SSL 框架

SSL 框架通过标准的 SSL/TLS 技术为以下 Neo4j 通信通道提供安全支持:

  • bolt (端口 - 7687)

  • https (端口 - 7473)

  • cluster (端口 - 6000, 70007688)
    注意:从 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

在大多数使用场景中,静态链接的 boringssl 版本的 netty-tcnative 足以启用 SSL 加密。

请按照以下步骤使用 OpenSSL:

  1. 将合适的 netty-tcnative 依赖项安装到 Neo4j 的 plugins/ 目录中。您需要的 netty-tcnative 版本取决于您的操作系统和架构。

  2. 设置 dbms.netty.ssl.provider=OPENSSL。使用 OpenSSL 可以显著提高性能,特别是对于 AES-GCM 加密,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。

  3. 重启 Neo4j。

证书和私钥

证书

SSL 配置要求 SSL 证书由证书颁发机构 (CA) 签发。所有证书必须遵循 X.509 标准,并以 PEM 编码文件形式保存。

可以使用 Let’s Encrypt 等非营利性 CA 免费生成有效的受信任证书。

示例 public.crt 文件
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJTRTEQ
     ...
xsUBvcQuyxewlvWRS18YB51J+yu0Xg==
-----END CERTIFICATE-----

本页说明假设您已经从 CA 获得了所需的证书,并将它们添加到了 public.crt 文件中。为此,您应该从叶证书开始,向上链向根证书,连接每个 PEM 编码的证书。

如果集群的所有实例使用相同的证书,请确保在生成证书时包含所有集群实例的 DNS 名称。同时也支持多主机证书和通配符证书。

如果将集群内加密作为集群配置的一部分进行设置,请确保集群端点上使用的证书支持服务器和客户端用法。这是因为当连接服务器进行集群配置时,每个服务器都会使用自己的证书作为客户端来验证到另一个服务器的连接。

这可以在证书详细信息中进行验证。

openssl x509 -in public.crt -noout -text

您应该会看到 X509v3 扩展密钥用法 (Extended Key Usage) 部分显示列出的两种用法。

X509v3 Extended Key Usage:
    TLS Web Server Authentication, TLS Web Client Authentication

转换

Neo4j 要求所有 SSL 证书必须采用 PEM 格式。如果您的证书是二进制 DER 格式,您必须将其转换为 PEM 格式。

DER 格式证书转换为 PEM 格式
openssl x509 -in cert.der -inform der -outform pem -out cert.crt

私钥

私钥必须采用标准的 PKCS #8 格式,并以 PEM 编码文件形式保存。

示例 private.key 文件
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAN5D0I4bgdQK4In6
     ...
oaMe91ZPQ1JI
-----END PRIVATE KEY-----

私钥也可以根据 PKCS #5 标准使用密码短语进行加密。

带有密码短语加密的 private.key 文件示例
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICojAcBgoqhkiG9w0BDAEEMA4ECL3eSAoRlJ18AgIIAASCAoCj7WDyjsgcawdv
     ...
lYeSjVah
-----END ENCRYPTED PRIVATE KEY-----

转换

如果私钥使用旧的 PKCS #1 格式编码,文件通常会以以下行开头:

-----BEGIN RSA PRIVATE KEY-----

您可以使用以下命令将其转换为 PKCS #8 格式:

将 PKCS #1 密钥转换为 PKCS #8 密钥
openssl pkcs8 -topk8 -in pkcs1.key -out pkcs8.key

未加密的私钥可以是 PKCS #1 或 PKCS #8 格式。可以使用以下命令对其进行加密:

使用密码块链接 (CBC) 模式下的 256 位 AES 将未加密密钥转换为加密的 PKCS #8 密钥
openssl pkcs8 -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA512 -in pkcs1or8.key -out pkcs8.encrypted.key
openssl 支持的加密参数为:
  • -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 可以加载并使用这些密钥,但它们已被视为弃用,并将在未来版本中移除。

验证密钥和证书

如有需要,您可以按如下方式验证密钥文件和证书:

验证密钥
openssl rsa -in private.key -check
验证 PEM 格式的证书
openssl x509 -in public.crt –text –noout

网络连接器

在启用 SSL 支持之前,必须确保以下网络连接器配置,以避免错误:

  • 使用 HTTPS 时,将 server.https.enabled 设置为 true

  • 使用 Bolt 时,将 server.bolt.tls_level 设置为 REQUIREDOPTIONAL

有关配置网络连接器的更多信息,请参阅 配置网络连接器

配置

通过为以下格式的参数赋值来配置 SSL 策略:

dbms.ssl.policy.<scope>.<setting-suffix>

  • scope 是通信通道的名称,例如 bolt, https, clusterbackup

  • setting-suffix 可以是以下任意项:

    Neo4j 不会验证 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 可为服务器启用相互验证。其他可选值包括 NONEOPTIONAL

    bolthttps 默认为 OPTIONAL
    clusterbackup 默认为 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 策略。

  1. 启用 Bolt 连接器以开启 Bolt 上的 SSL

    server.bolt.enabled=true (default is true)
  2. certificates 下设置 bolt 文件夹。

    1. <NEO4J_HOME>/certificates 文件夹下创建 bolt 目录

      mkdir certificates/bolt
    2. <NEO4J_HOME>/certificates/bolt 文件夹下创建 trustedrevoked 目录

      mkdir certificates/bolt/trusted
      mkdir certificates/bolt/revoked
  3. 将证书 private.keypublic.crt 文件放入 <NEO4J_HOME>/certificates/bolt 文件夹中

    cp /path/to/certs/private.key certificates/bolt
    cp /path/to/certs/public.crt certificates/bolt
  4. public.crt 文件放入 <NEO4J_HOME>/certificates/bolt/trusted 文件夹中。

    cp /path/to/certs/public.crt certificates/bolt/trusted
  5. (可选)如果特定证书被吊销,请将其放入 <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。

  6. neo4j.conf 中设置 Bolt SSL 配置。

    1. 将 SSL Bolt 策略设置为 true

      dbms.ssl.policy.bolt.enabled=true
    2. 设置正确的证书路径以及正确的密钥和证书文件

      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 之外,请设置证书目录的绝对路径。

    3. 将 Bolt 客户端身份验证设置为 NONE 以禁用相互验证

      dbms.ssl.policy.bolt.client_auth=NONE
    4. 设置 Bolt TLS 级别,允许连接器接受加密和/或未加密的连接

      server.bolt.tls_level=REQUIRED (default is DISABLED)

      REQUIRED 表示连接器仅接受加密的客户端连接并拒绝未加密的连接。OPTIONAL 表示连接器既接受加密的也接受未加密的客户端连接。

  7. 测试到指定主机和 Bolt 端口的 SSL 连接并查看证书

    openssl s_client -connect my_domain.com:7687

通过 Bolt 上的 SSL 进行连接

每个 neo4jbolt URI 方案都允许包含额外加密和信任信息的变体。+s 变体启用带有完整证书检查的加密。+ssc 变体启用不进行证书检查的加密。后一种变体专为自签名证书设计。

URI 方案 路由 描述

neo4j

未加密

neo4j+s

带有完整证书的加密

neo4j+ssc

带有自签名证书的加密

bolt

未加密

bolt+s

带有完整证书的加密

bolt+ssc

带有自签名证书的加密

一旦 Bolt 上启用了 SSL,您就可以使用 neo4j+sbolt+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 获取更多说明。

  1. 启用 HTTPS 连接器以开启 HTTPS 上的 SSL

    server.https.enabled=true (default is false)
  2. certificates 下设置 https 文件夹。

    1. <NEO4J_HOME>/certificates 文件夹下创建 https 目录

      mkdir certificates/https
    2. <NEO4J_HOME>/certificates/https 文件夹下创建 trustedrevoked 目录

      mkdir certificates/https/trusted
      mkdir certificates/https/revoked
  3. 将证书 private.keypublic.crt 文件放入 <NEO4J_HOME>/certificates/https 文件夹中

    cp /path/to/certs/private.key certificates/https
    cp /path/to/certs/public.crt certificates/https
  4. public.crt 文件放入 <NEO4J_HOME>/certificates/https/trusted 文件夹中。

    cp /path/to/certs/public.crt certificates/https/trusted
  5. (可选)如果特定证书被吊销,请将其放入 <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。

  6. neo4j.conf 中设置 HTTPS SSL 配置。

    1. 将 SSL HTTPS 策略设置为 true

      dbms.ssl.policy.https.enabled=true
    2. 设置正确的证书路径以及正确的密钥和证书文件

      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 之外,请设置证书目录的绝对路径。

    3. 将 HTTPS 客户端身份验证设置为 NONE 以禁用相互验证

      dbms.ssl.policy.https.client_auth=NONE
    4. 禁用 HTTP 连接器

      server.http.enabled=false
  7. 测试到指定主机和 HTTPS 端口的 SSL 连接并查看证书

    openssl s_client -connect my_domain.com:7473

配置集群内通信的 SSL

集群内加密是集群通信的安全解决方案。Neo4j 集群通过 3 个端口进行通信:

  • 6000 - 事务

  • 7000 - Raft 通信

  • 7688 - 服务器端路由

要配置集群内通信的 SSL,请创建文件夹结构并将密钥和证书文件放入其中。然后,在 neo4j.conf 文件中配置 SSL 集群策略,并测试集群内通信是否已加密。

设置集群内通信的 SSL 证书

  1. <NEO4J_HOME>/certificates 文件夹下创建 cluster 目录

    mkdir certificates/cluster
  2. <NEO4J_HOME>/certificates/cluster 文件夹下创建 trustedrevoked 目录

    mkdir certificates/cluster/trusted
    mkdir certificates/cluster/revoked
  3. 将证书 private.keypublic.crt 文件放入 <NEO4J_HOME>/certificates/cluster 文件夹中

    cp /path/to/certs/private.key certificates/cluster
    cp /path/to/certs/public.crt certificates/cluster
  4. public.crt 文件放入 <NEO4J_HOME>/certificates/cluster/trusted 文件夹中。

    cp /path/to/certs/public.crt certificates/cluster/trusted

    如果每台服务器都有自己由 CA 签名的证书,则每台服务器的公共证书都必须放入集群每个实例的 trusted 文件夹中。这样,服务器就能够相互建立信任关系。

  5. (可选)如果特定证书被吊销,请将其放入 <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 配置

  1. 将集群 SSL 策略设置为 true

    dbms.ssl.policy.cluster.enabled=true
  2. 设置正确的证书路径以及正确的密钥和证书文件

    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 之外,请设置证书目录的绝对路径。

  3. 将集群客户端身份验证设置为 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 策略来为它启用 SSL。

设置备份通信的 SSL 时,证书有两种选择:

  • 自签名证书 — 这通常适用于您控制连接两端的情况,证书的分发可以实现自动化且安全。但是,自签名证书无法验证服务器身份,因此不能被客户端信任,并且容易受到中间人攻击。

  • 由证书颁发机构 (CA) 签名的证书 — 这种选择更安全,因为已知的受信任机构会验证服务器的身份,确保真实性并防止模拟。

您可以通过以下方式之一为备份通信配置 SSL:

  • 在备份服务器和客户端的 trusted_dir 中使用相同的证书。
    这种方法配置简单,但安全性较低,因为两端共享相同的身份并信任相同的证书。

  • 在备份服务器和客户端上镜像证书以实现相互验证。
    将服务器证书添加到客户端的 trusted_dir,并将客户端证书添加到服务器的 trusted_dir。通过这种方式,服务器会验证客户端的证书,从而实现双向验证。

  • 使用证书颁发机构 (CA) 签发客户端和服务器的证书。在这种情况下,trusted_dir 只需包含 CA 或中间证书。

设置备份的 SSL 证书

创建文件夹结构并将密钥和证书文件放入其中。

  1. <NEO4J_HOME>/certificates 文件夹下创建 backup 目录

    mkdir certificates/backup
  2. <NEO4J_HOME>/certificates/backup 文件夹下创建 trustedrevoked 目录

    mkdir certificates/backup/trusted
    mkdir certificates/backup/revoked
  3. 将证书 private.keypublic.crt 文件放入 <NEO4J_HOME>/certificates/backup 文件夹中

    cp /path/to/certs/private.key certificates/backup
    cp /path/to/certs/public.crt certificates/backup
  4. public.crt 文件放入 <NEO4J_HOME>/certificates/backup/trusted 文件夹中。

    cp /path/to/certs/public.crt certificates/backup/trusted
  5. (可选)如果特定证书被吊销,请将其放入 <NEO4J_HOME>/certificates/backup/revoked 文件夹中。

    cp /path/to/certs/public.crt certificates/backup/revoked

验证备份文件夹结构和权限

假设 neo4j 用户运行该服务,文件夹结构应如下所示,包含正确的文件权限、组和所有权:

路径 目录/文件 所有者 权限 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 配置。

  1. 将备份 SSL 策略设置为 true

    dbms.ssl.policy.backup.enabled=true
  2. 设置正确的证书路径以及正确的密钥和证书文件

    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 之外,请设置证书目录的绝对路径。

  3. 将备份客户端身份验证设置为 REQUIRE 以启用相互验证,这意味着通道的两端都必须进行身份验证

    dbms.ssl.policy.backup.client_auth=REQUIRE

Neo4j 不会验证 setting-suffix,如果拼写错误或不正确,它将被忽略。更多详细信息,请参阅 配置

为 SSL 配置备份客户端

使用 neo4j-admin backup 命令时,备份客户端也需要配置为使用 SSL。无论您针对的是哪个备份端口(请参阅 配置备份通信的 SSL),备份客户端都会使用 dbms.ssl.policy.backup.* 中指定的 SSL 策略,前提是服务器和客户端的 SSL 策略名称匹配。

如果备份客户端位于与备份服务器不同的机器上,您还必须在备份客户端机器上安装 SSL 证书和密钥,以便备份客户端可以验证服务器,反之亦然。

以下步骤假设您已经在备份服务器机器上设置了 SSL 证书和密钥,并且正在使用自签名证书。

例如,如果您设置了 配置备份通信的 SSL 章节中描述的备份 SSL 策略,则需要在备份客户端机器上的 neo4j-admin.conf 文件中设置以下内容:

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=REQUIRE
dbms.ssl.policy.backup.tls_versions=TLSv1.2,TLSv1.3
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

其他 SSL 配置

使用加密的私钥

要使用加密的私钥,请配置以下设置。私钥密码必须是纯文本格式,不能包含任何引号。

Bolt
dbms.ssl.policy.bolt.private_key_password=<clear text password>
HTTPS
dbms.ssl.policy.https.private_key_password=<password>
集群内加密
dbms.ssl.policy.cluster.private_key_password=<password>
备份
dbms.ssl.policy.backup.private_key_password=<password>

如果由于安全限制无法硬编码纯文本私钥密码,可以通过以下步骤设置为使用动态密码获取:

  1. 创建一个包含私钥 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)。

  2. 验证是否可以从 password.enc 读取加密密码

    base64 -w 0 certificate.crt | openssl aes-256-cbc -a -d -in password.enc -pass stdin
  3. 设置 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 在启动时带有 --expand-commands 选项。更多信息,请参阅 命令扩展

使用特定密码

在某些情况下,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 版本开始,不再支持 TLS v1.2 网络加密中使用的基于 CBC(密码块链接)的密码(RFC 8447)。有关更多信息,请参阅 SSL 框架中的破坏性更改

从 2025.10 开始,Neo4j 移除了 Java 21 默认使用的不安全 CBC 密码套件:

  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA256

  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA256

但是,您仍然可以通过显式指定其配置并在您的设置中引用它们来使用它们。

Bolt
dbms.ssl.policy.bolt.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA3844
HTTPS
dbms.ssl.policy.https.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA3844
集群内加密
dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA3844
备份
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA3844

使用 OCSP 装订 (Stapling)

Neo4j 支持 OCSP 装订,它在服务器端实现,并可在 neo4j.config 文件中进行配置。OCSP 装订也可用于 Java Bolt 驱动程序和 HTTP API。

在服务器端的 neo4j.conf 文件中,配置以下设置:

  1. 将 SSL Bolt 策略设置为 true

    dbms.ssl.policy.bolt.enabled=true
  2. 为 Bolt 启用 OCSP 装订

    server.bolt.ocsp_stapling_enabled=true (default = false)

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 配置而无需重启。这减少了集群成员短暂丢失带来的负面影响。

以下步骤概述了证书轮换的过程。

  1. 在所有集群成员上启用证书的动态重新加载。最好在部署集群时执行此操作,因为更改此配置需要重启。

    dbms.security.tls_reload_enabled=true (default is false)
  2. 通过覆盖文件系统上的旧证书或将新证书复制到新位置来替换它们。

    请记住,如果您选择将证书复制到新目录或使用不同的文件名,则必须动态更新 SSL 策略设置。如果您是在原位覆盖证书而不进行其他更改,则无需动态更新 SSL 策略设置。

    新旧证书可以共存于文件系统中,但配置中只能引用其中一个。
    需要将新证书复制到所有集群成员。

  3. 对任何 SSL 配置进行必要的更改和/或替换受影响范围的证书。

  4. 依次使用 bolt URI 方案 通过 Cypher Shell 连接到每个集群成员,并运行重新加载过程。

    dbms.security.reloadTLS()
  5. 新设置将立即生效;但是,现有连接不会被主动终止。这意味着虽然新连接将使用新证书,但现有连接(在更新前建立)将继续使用旧证书。即使证书过期,活动连接也不会受到影响,因为证书仅在初始连接握手期间使用。

  6. 使用外部工具(如 Nmap)验证集群内通信是否仍已加密,如 配置集群内通信的 SSL 所述。

术语

以下术语与 Neo4j 中的 SSL 支持相关:

证书颁发机构 (CA)

一种可信实体,负责签发用于验证数字实体身份的电子文档。该术语通常指全球认可的 CA,但也包括组织内部受信任的 CA。这些电子文档即数字 证书。它们是安全通信的重要组成部分,在 公钥基础设施 中发挥重要作用。

证书吊销列表 (CRL)

如果证书遭到破坏,可以吊销该证书。这是通过一个列表(位于一个或多个文件中)来完成的,其中列出了被吊销的证书。CRL 始终由签发相应证书的 CA 发布。

密码 (cipher)

用于执行加密或解密的算法。在加密通信的一般实现中,Neo4j 隐式使用了 Java 平台自带的密码。SSL 框架的配置也允许明确声明允许使用的密码。

通信通道

与 Neo4j 数据库通信的方式。可用的通道有:

  • Bolt 客户端流量

  • HTTPS 客户端流量

  • 集群内通信

  • 备份流量

加密对象

私钥证书CRL 等工件。

配置参数

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) 定义 公钥 证书格式的标准。