Skip to content

SSL/TLS

本章节介绍如何在集群节点之间(服务端和客户端)以及接入集群的客户端配置 SSL/TLS 加密连接。

1.考虑事项

集群上下文中的所有内部连接以及集群的用户交互接口都启用了 SSL,通信类别如下:

  • 在用户和集群(节点)之间的 REST 请求;
  • 在用户和平台客户端之间;
  • 节点之间的网络。

所有 SSL 配置都在节点级别执行。

Ignite 不支持 SSL 证书的直接路径。而是使用 PKCS12JKS 密钥库。

2.REST

REST 的 SSL 标准实现涉及在单独的端口上配置安全连接,Ignite 分别在各自的端口上支持 HTTPHTTPS

下面提供了 JSON 格式的 REST 安全配置:

提示

在 Ignite 3 中,配置文件可以是 JSONHOCON 格式。

json
{
    "ignite" : {
        "rest" : {
            "dualProtocol" : false,
            "httpToHttpsRedirection" : false,
            "ssl" : {
                "enabled" : true,
                "port" : 10400,
                "portRange" : 100,
                "keyStore" : {
                    "type" : "PKCS12",
                    "path" : "must not be empty",
                    "password" : "may be empty"
                }
            }
        }
    }
}

3.客户端和JDBC

Ignite 3 客户端实现基于 Netty 框架,该框架支持通过SSLContextBuilder配置安全连接。

3.1.服务端配置

在服务端配置 SSL 默认是在配置文件中添加SSL属性,以下是 JSON 格式的示例:

提示

在 Ignite 3 中,配置文件可以是 JSONHOCON 格式。

json
{
    "ignite" : {
        "clientConnector" : {
            "ssl" : {
                "enabled" : true,
                "clientAuth" : "require",
                "keyStore" : {
                    "type" : "PKCS12",
                    "path" : "must not be empty",
                    "password" : "may be empty"
                },
                "trustStore" : {
                    "type" : "PKCS12",
                    "path" : "must not be empty",
                    "password" : "may be empty"
                }
            }
        }
    }
}

如果clientConnector启用了 SSL,那么使用 JDBC 时需在代码中设置相应的属性:

java
var url =
    "jdbc:ignite:thin://{address}:{port}"
        + "?sslEnabled=true"
        + "&trustStorePath=" + trustStorePath
        + "&trustStoreType=JKS"
        + "&trustStorePassword=" + password
        + "&clientAuth=require"
        + "&keyStorePath=" + keyStorePath
        + "&keyStoreType=PKCS12"
        + "&keyStorePassword=" + password;
        try (Connection conn = DriverManager.getConnection(url)) {
            // Other actions.
        }

3.2.客户端配置

3.2.1.Java

要在 Java 客户端中启用 SSL,需使用IgniteClient类并将 SSL 配置传入:

java
var sslConfiguration = SslConfiguration.builder()
                        .enabled(true)
                        .trustStoreType("JKS")
                        .trustStorePath(trustStorePath)
                        .trustStorePassword(password)
                        .clientAuth(REQUIRE)
                        .keyStorePath(keyStorePath)
                        .keyStorePassword(password)
                        .build();

try (IgniteClient client = IgniteClient.builder()
    .addresses("localhost:10800")
    .ssl(sslConfiguration)
    .build()
)

3.2.2..NET

添加ISslStreamFactory类型的IgniteClientConfiguration.SslStreamFactory属性:

这里是预定义的实现

使用基础类库SslStream

未经客户端授权的基本使用:

csharp
var cfg = new IgniteClientConfiguration { SslStreamFactory = new() }

3.2.3.命令行

要在命令行端启用 SSL,需使用cli config set命令:

shell
cli config set cli.trust-store.type=<type>
cli config set cli.trust-store.path=<path>
cli config set cli.trust-store.password=<password>

将命令行的安全配置放在单独的文件中,并设置权限,以保护其免受未经授权的读/写操作。此配置文件必须与常规配置文件中的配置项匹配。

4.网络配置

节点网络基于 Netty 框架。该配置与 Ignite 客户端的配置相同,但处理 Ignite 3 配置的部分除外。

提示

在 Ignite 3 中,配置文件可以是 JSONHOCON 格式。

json
{
    "ignite" : {
        "network" : {
            "ssl" : {
                "enabled" : true,
                "clientAuth" : "none",
                "keyStore" : {
                    "type" : "PKCS12",
                    "path" : "must not be empty",
                    "password" : "may be empty"
                },
                "trustStore" : {
                    "type" : "PKCS12",
                    "path" : "must not be empty",
                    "password" : "may be empty"
                }
            }
        }
    }
}

5.SSL 客户端身份验证(mTLS支持)

一个可选项,使用的连接可以支持客户端身份验证功能,为服务端的每个连接单独配置。

双向身份验证要求服务端和客户端都具有相互信任的证书,客户端生成一个私钥,将其存储在其密钥库中,并由服务端的信任库信任的实体对其进行签名。

若要支持客户端身份验证,连接必须包含clientAuthtrustStorekeyStore属性,下面是一个JSON格式的客户端配置示例:

提示

在 Ignite 3 中,配置文件可以是 JSONHOCON 格式。

json
{
    "ignite" : {
        "clientConnector.ssl" : {
            "enabled" : true,
            "clientAuth" : "require",
            "keyStore" : {
                "path" : "must not be empty",
                "password" : "may be empty"
            },
            "trustStore" : {
                "type" : "JKS",
                "path" : "must not be empty",
                "password" : "may be empty"
            }
        }
    }
}

18624049226