SSL/TLS
本章节介绍如何在集群节点之间(服务端和客户端)以及接入集群的客户端配置 SSL/TLS 加密连接。
1.考虑事项
集群上下文中的所有内部连接以及集群的用户交互接口都启用了 SSL,通信类别如下:
- 在用户和集群(节点)之间的 REST 请求;
- 在用户和平台客户端之间;
- 节点之间的网络。
所有 SSL 配置都在节点级别执行。
Ignite 不支持 SSL 证书的直接路径。而是使用 PKCS12
和 JKS
密钥库。
2.REST
REST 的 SSL 标准实现涉及在单独的端口上配置安全连接,Ignite 分别在各自的端口上支持 HTTP
和 HTTPS
。
下面提供了 JSON
格式的 REST 安全配置:
提示
在 Ignite 3 中,配置文件可以是 JSON
或 HOCON
格式。
{
"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 中,配置文件可以是 JSON
或 HOCON
格式。
{
"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 时需在代码中设置相应的属性:
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 配置传入:
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
。
未经客户端授权的基本使用:
var cfg = new IgniteClientConfiguration { SslStreamFactory = new() }
3.2.3.命令行
要在命令行端启用 SSL,需使用cli config set
命令:
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 中,配置文件可以是 JSON
或 HOCON
格式。
{
"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支持)
一个可选项,使用的连接可以支持客户端身份验证功能,为服务端的每个连接单独配置。
双向身份验证要求服务端和客户端都具有相互信任的证书,客户端生成一个私钥,将其存储在其密钥库中,并由服务端的信任库信任的实体对其进行签名。
若要支持客户端身份验证,连接必须包含clientAuth
、trustStore
和keyStore
属性,下面是一个JSON
格式的客户端配置示例:
提示
在 Ignite 3 中,配置文件可以是 JSON
或 HOCON
格式。
{
"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