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 所述。

在大多数使用情况下,netty-tcnative 的静态链接 boringssl 变体足以启用 SSL 加密。

请按照以下步骤使用 OpenSSL

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

  2. 设置 dbms.netty.ssl.provider=OPENSSL。使用 OpenSSL 可以显著提高性能,特别是对于 AES-GCM-cryptos,例如 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 扩展密钥使用部分显示了列出的两种用法

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。可以使用以下命令对其进行加密

使用 256 位 AES 在密码块链 (CBC) 模式下将未加密的密钥转换为加密的 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 是通信通道的名称,例如 bolthttpsclusterbackup

  • 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

    bolthttpsOPTIONAL
    clusterbackupREQUIRE

    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 - 服务器端路由

要设置集群内加密,请在每个服务器上创建文件夹结构并将密钥文件和证书放置在其中。然后,您需要在 neo4j.conf 文件中配置 SSL 集群策略并测试集群内通信是否已加密。

  1. certificates 下设置 cluster 文件夹。

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

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

      mkdir certificates/cluster/trusted
      mkdir certificates/cluster/revoked
  2. 将证书 private.keypublic.crt 文件放置在 <NEO4J_HOME>/certificates/cluster 文件夹下

    cp /path/to/certs/private.key certificates/cluster
    cp /path/to/certs/public.crt certificates/cluster
  3. public.crt 文件放置在 <NEO4J_HOME>/certificates/cluster/trusted 文件夹下。

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

    如果每个服务器都有一个由 CA 签名的自己的证书,那么每个服务器的公共证书都必须放在集群的每个实例上的 trusted 文件夹中。因此,服务器能够相互建立信任关系。

  4. (可选)如果特定证书被吊销,则将其放置在 <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。

  5. 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 证书将共享。

    4. 验证集群内通信是否已加密。您可以使用外部工具,例如 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 备份策略。

  1. certificates 下设置 backup 文件夹。

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

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

      mkdir certificates/backup/trusted
      mkdir certificates/backup/revoked
  2. 将证书 private.keypublic.crt 文件放置在 <NEO4J_HOME>/certificates/backup 文件夹下

    cp /path/to/certs/private.key certificates/backup
    cp /path/to/certs/public.crt certificates/backup
  3. public.crt 文件放置在 <NEO4J_HOME>/certificates/backup/trusted 文件夹下。

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

  5. 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

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)

使用动态命令需要使用 --expand-commands 选项启动 Neo4j。有关更多信息,请参阅 命令扩展

使用特定密码

在某些情况下,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 中的变更、弃用和移除

Bolt
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
HTTPS
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

使用 OCSP 封装

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 方案 连接到每个集群成员(依次进行),并运行重新加载过程

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

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

术语

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

证书颁发机构 (CA)

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

证书吊销列表 (CRL)

如果证书被泄露,则可以吊销该证书。这是通过一个列表(位于一个或多个文件中)来完成的,该列表明确列出了哪些证书已被吊销。CRL 始终由颁发相应证书的 CA 颁发。

密码

执行加密或解密的算法。在加密通信的最通用实现中,Neo4j 隐式使用了作为 Java 平台一部分的密码。SSL 框架的配置也允许显式声明允许的密码。

通信通道

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

  • Bolt 客户端流量

  • HTTPS 客户端流量

  • 集群内通信

  • 备份流量

加密对象

表示 私钥证书CRL 等工件的术语。

配置参数

这些是在 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) 标准,定义了 公钥 证书的格式。

© . All rights reserved.