SSL 框架

SSL 框架提供支持,可以使用标准 SSL/TLS 技术保护以下 Neo4j 通信通道。

  • bolt(端口 - 7687

  • https(端口 - 7473

  • cluster(端口 - 5000600070007688

  • backups(端口 - 6362

此页面介绍如何在您的环境中设置 SSL,以及如何查看、验证和测试证书。

从 Neo4j 5.23 开始,弃用使用端口 5000 进行发现管理和发现服务 v1。Neo4j 5.23 引入了发现服务 v2,现在它使用端口 6000。有关更多详细信息,请参阅 集群 → 集群服务器发现

SSL 提供程序

Neo4j 的安全网络通过 Netty 库提供,该库支持原生 JDK SSL 提供程序以及 Netty 支持的 OpenSSL 派生程序。每个版本的 Neo4j 都附带一个 Netty 版本,并且 Netty 需要特定版本的 `netty-tcnative` 库才能兼容。

使用 OpenSSL 的步骤如下:

使用 `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`。

表 1. 每个 Neo4j 版本的 Netty-TCNative 支持
Neo4j 版本 tcnative 版本 直接链接

5.23

2.0.65.Final。仅需要 netty-tcnative-boringssl-static。

netty-tcnative-boringssl-static-2.0.65.Final

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。

证书和私钥

证书

SSL 配置要求 SSL 证书 由证书颁发机构 (CA) 颁发。所有证书都必须遵循 X.509 标准并保存在 `PEM 编码` 文件中。

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

示例 public.crt 文件
-----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

转换

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` 设置为 `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 策略。

  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)

      在 Neo4j 3.5 版本中,默认值为OPTIONAL。在 Neo4j 4.x 版本中,默认值为DISABLED,其中此连接器仅接受未加密的客户端连接,并且所有加密连接都将被拒绝。当此连接器仅接受加密的客户端连接并且所有未加密的连接都将被拒绝时,请使用REQUIRED。使用OPTIONAL时,此连接器将接受加密或未加密的客户端连接。

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

    openssl s_client -connect my_domain.com:7687

使用 Bolt 上的 SSL 连接

每个neo4jboltURI 方案都允许包含额外加密和信任信息的变体。+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>
Neo4j 浏览器

连接 URL下拉菜单中,选择要使用的 URI 方案(neo4j+sbolt+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

  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 集群在 4 个端口上进行通信

  • 5000 - 发现管理

  • 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/17/docs/specs/security/standard-names.html#jsse-cipher-suite-names

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 4.2开始,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中的SSL支持相关

证书颁发机构 (CA)

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

证书吊销列表 (CRL)

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

密码

执行加密或解密的算法。在加密通信的最通用实现中,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) 的标准,定义了公钥证书的格式。