知识库

集群内 SSL 加密演示

本文档提供了逐步演示,将自签名 SSL 证书部署到因果集群的成员实例,以实现集群内部加密的过程。步骤概述如下:

  • 生成并安装密码学对象

  • 创建 SSL 策略

  • 使用 SSL 策略配置因果集群

  • 验证集群的安全运行

让我们一起演示 SSL 证书的创建、部署和验证。

安装 OpenSSL

证书可以由受信任的证书颁发机构(CA)签署,也可以像本例一样自签名。我们将使用 OpenSSL 创建自签名证书。首先需要安装 OpenSSL 才能创建自签名证书。

Windows

可以使用 Windows 二进制文件安装 OpenSSL。下面的链接提供了一些示例二进制文件。

Linux

大多数 Linux 发行版已预装 OpenSSL。如果没有,请使用软件包管理器安装,例如:

$ sudo apt-get install openssl

Mac

在 macOS 上,可通过 macports 安装 OpenSSL,安装方法见此处:https://www.macports.org/install.php

或者使用 Homebrew 包管理器,如下所示:

$ brew install openssl

验证安装

安装完成后,可运行 brew info opensslopenssl version -a 检查版本、安装目录等信息。

$ openssl version -a
LibreSSL 2.8.3
built on: date not available
platform: information not available
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: information not available
OPENSSLDIR: "/private/etc/ssl"

创建 Neo4j SSL 框架目录结构

Neo4j SSL 框架 需要创建如下目录结构。

<NEO4J_HOME>/certificates
                └── cluster
                    ├── revoked
                    └── trusted

在 <NEO4J_HOME> 下运行以下命令以创建上述结构。

---
$ mkdir certificates/cluster
$ mkdir certificates/cluster/trusted
$ mkdir certificates/cluster/revoked
---

创建 SSL 证书和密钥

使用以下命令创建证书 cert.pem 与密钥 key.pem,并将 xxx 替换为证书的有效天数。

$ sudo openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days XXX

或者使用较小的密钥长度:

$ sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX

以下对上述 openssl 命令使用的每个参数进行说明。

  • req:PKCS#10 证书请求及证书生成工具。

  • x509:输出自签名证书,而非证书请求。

  • newkey:创建新的证书请求和私钥。注意 rsa:nbits,其中 nbits 为位数,生成相应大小的 RSA 密钥。

  • keyout:指定写入新创建私钥的文件名。

  • out:指定写入的输出文件名,默认写入标准输出。

  • days:在使用 -x509 选项时指定证书的有效天数(默认 30 天)。

下面是执行 openssl 生成命令后的输出。

$ sudo openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
Password:
Generating a 4096 bit RSA private key
..................................................................................................................................................++
................................................................................................++
writing new private key to 'key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:UK
State or Province Name (full name) [Some-State]:London
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Neo4j
Organizational Unit Name (eg, section) []:CS
Common Name (e.g. server FQDN or YOUR name) []:CS
Email Address []:myemail@email.com

以下命令使用上面生成的 .pem 文件,生成 public.crtprivate.key 文件。

$ sudo openssl x509 -outform pem -in cert.pem -out public.crt
$ openssl rsa -in key.pem -out private.key

部署 SSL 证书和密钥

将上述生成的 private.keypublic.crt 放入 $NEO4J_HOME/certificates/cluster。随后将 public.crt 再放入 $NEO4J_HOME/certificates/cluster/trusted 目录。

certificates
└── cluster
    ├── private.key
    ├── public.crt
    ├── revoked
    └── trusted
        └── public.crt

随后在集群中每个实例的 neo4j.conf 中添加以下内容,并确保将 [Absolute_Path_Of_$NEO4J_HOME] 替换为相应的绝对路径。

dbms.ssl.policy.cluster.enabled=true
dbms.ssl.policy.cluster.base_directory=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster
dbms.ssl.policy.default.base_directory=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster
dbms.ssl.policy.default.trusted_dir=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster/trusted
dbms.ssl.policy.default.revoked_dir=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster/revoked
dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
dbms.ssl.policy.cluster.client_auth=REQUIRE

验证集群内部加密

现在我们可以初始化所有集群实例。实例启动并可用后,可使用 nmap 工具(有时随 openssl 一起部署,若未随带则需单独安装)检查可用的 SSL 密码套件,如下所示。

$ nmap --script ssl-enum-ciphers -p 5000 localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-07-07 14:18 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000049s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
5000/tcp open  upnp
| ssl-enum-ciphers:
|   TLSv1.2:
|     ciphers:
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|     compressors:
|       NULL
|     cipher preference: indeterminate
|     cipher preference error: Too few ciphers supported
|     warnings:
|       Key exchange (secp256r1) of lower strength than certificate key
|_  least strength: A

Nmap done: 1 IP address (1 host up) scanned in 0.31 seconds

其中端口 5000 为默认的因果集群发现管理端口。上述配置还会在端口 6000(因果集群事务端口)和 7000(因果集群 RAFT 端口)上启用 SSL。Neo4j 端口使用详情请参见以下链接。

另一种确认方式是,在 Neo4j 的 debug.log 中找到类似下面的调试信息。

2022-07-08 09:30:28.006+0000 INFO  [o.n.s.c.SslPolicyLoader] Loaded SSL policy 'CLUSTER' = SslPolicy{keyCertChain=Subject: EMAILADDRESS=myemail@email.com, CN=neo4j.local, OU=Support, O=Neo4j, L=London, ST=London, C=UK, Issuer: EMAILADDRESS=myemail@email.com, CN=neo4j.local, OU=Support, O=Neo4j, L=London, ST=London, C=UK, ciphers=[TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384], tlsVersions=[TLSv1.2], clientAuth=REQUIRE}

参考文献

© . This site is unofficial and not affiliated with Neo4j, Inc.