[开启Kerberos]-Trino启动-缺失PEM证书处理
证书缺失
我们在启用 Kerberos 的环境中启动 Trino 时,Trino 会主动加载 SSL 所需的 PEM 证书。如果 trino.pem
缺失,就会导致启动过程直接报错并退出。
# 一、Trino 启动失败的现象
Trino 在启动过程中会检查:
/etc/trino/conf/trino.pem/etc/trino/conf/trino.key/etc/trino/conf/trino.crt
当 PEM 不存在时,会直接触发如下异常:

# 1、核心报错堆栈
1) [Guice/ErrorInCustomProvider]: IllegalArgumentException: Error loading PEM key store: /etc/trino/conf/trino.pem
while locating HttpServerProvider
at java.base/DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
while locating HttpServer
Learn more:
https://github.com/google/guice/wiki/ERROR_IN_CUSTOM_PROVIDER
Caused by: IllegalArgumentException: Error loading PEM key store: /etc/trino/conf/trino.pem
at ReloadableSslContextFactoryProvider.loadKeyStore(ReloadableSslContextFactoryProvider.java:208)
at ReloadableSslContextFactoryProvider.loadContextFactory(ReloadableSslContextFactoryProvider.java:108)
at ReloadableSslContextFactoryProvider.<init>(ReloadableSslContextFactoryProvider.java:100)
at HttpServer.createReloadingSslContextFactory(HttpServer.java:495)
at HttpServer.lambda$new$1(HttpServer.java:246)
at java.base/Optional.orElseGet(Optional.java:364)
at HttpServer.<init>(HttpServer.java:246)
at HttpServerProvider.get(HttpServerProvider.java:110)
at HttpServerProvider.get(HttpServerProvider.java:41)
at ProviderInternalFactory.provision(ProviderInternalFactory.java:86)
at BoundProviderFactory.provision(BoundProviderFactory.java:72)
at ProviderInternalFactory$1.call(ProviderInternalFactory.java:67)
at ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:109)
at LifeCycleModule.provision(LifeCycleModule.java:53)
at ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:117)
at ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:66)
at ProviderInternalFactory.circularGet(ProviderInternalFactory.java:62)
at BoundProviderFactory.get(BoundProviderFactory.java:59)
at ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at SingletonScope$1.get(SingletonScope.java:169)
at InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
at InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:213)
at InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:186)
at InternalInjectorCreator.build(InternalInjectorCreator.java:113)
at Guice.createInjector(Guice.java:87)
at Bootstrap.initialize(Bootstrap.java:335)
at Server.doStart(Server.java:136)
at Server.lambda$start$0(Server.java:90)
at io.trino.$gen.Trino_____20251111_012044_1.run(Unknown Source)
at Server.start(Server.java:90)
at TrinoServer.main(TrinoServer.java:37)
Caused by: FileNotFoundException: /etc/trino/conf/trino.pem (No such file or directory)
at java.base/FileInputStream.open0(Native Method)
at java.base/FileInputStream.open(FileInputStream.java:219)
at java.base/FileInputStream.<init>(FileInputStream.java:159)
at Files$FileByteSource.openStream(Files.java:134)
at Files$FileByteSource.read(Files.java:158)
at ByteSource$AsCharSource.read(ByteSource.java:487)
at PemReader.isPem(PemReader.java:103)
at ReloadableSslContextFactoryProvider.loadKeyStore(ReloadableSslContextFactoryProvider.java:202)
... 30 more
2) [Guice/ErrorInCustomProvider]: IllegalArgumentException: Error loading PEM key store: /etc/trino/conf/trino.pem
while locating HttpServerProvider
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
关键点
Trino 自身并不会自动生成 PEM,因此只要文件缺失,就会在 HttpServerProvider 初始化阶段直接失败。
# 二、Trino 为何需要 PEM?
Trino 在启用 Kerberos 后,默认仍会使用 HTTPS 通道暴露 Web / REST 接口,Ambari 也通过这个通道进行健康检查。
因此 Trino 必须加载:
- 私钥:
trino.key - 证书:
trino.crt - PEM 合并文件:
trino.pem
PEM 是什么?
PEM = CRT(公钥证书) + KEY(私钥),Trino 用它进行 TLS 握手。
# 三、解决方案:生成 PEM 文件
如果你有第三方签发的证书,可以直接使用;若没有,可以本地生成一份自签名证书,用于通过 Ambari 启动检查。
这里以实验验证为目的,在 Trino 主机执行:
# 1、生成 key + crt
sudo openssl req -newkey rsa:2048 -nodes \
-keyout /etc/trino/conf/trino.key \
-x509 -days 365 \
-out /etc/trino/conf/trino.crt \
-subj "/CN=$(hostname -f)"
1
2
3
4
5
2
3
4
5
# 2、合并生成 PEM
sudo cat /etc/trino/conf/trino.crt /etc/trino/conf/trino.key > /etc/trino/conf/trino.pem
1
# 3、设置权限与用户组
sudo chown trino:hadoop /etc/trino/conf/trino.pem
sudo chmod 640 /etc/trino/conf/trino.pem
1
2
2
权限说明
- Trino 进程用户必须能读取 PEM
- 避免将权限设置为
777,会触发安全警告
# 四、生成后的文件验证
执行上述操作后,我们在 Trino 主机观察到:

trino.key / trino.crt / trino.pem 均已生成并位于正确目录:

# 五、重启 Ambari 中的 Trino 服务
处理完证书后,返回 Ambari 页面重新启动 Trino,即可正常通过检查。

说明
即便仅用于内部通信,自签名证书足以通过服务检查。 如果要接入企业公钥体系,再替换为正式证书即可。