You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RHEL8容器中用TLS Toolkit配置NiFi的HTTPS

解决NiFi容器化HTTPS配置的两个关键问题

我来帮你一步步搞定这两个困扰你的问题,先从Dockerfile里的文件复制异常说起:

问题1:构建阶段复制证书到conf目录后,ls看不到文件

这其实是apache/nifi官方镜像的一个特性:它的/opt/nifi/nifi-current/conf目录被声明为VOLUME。在Docker构建阶段,对VOLUME目录的修改不会被保留到最终镜像中——容器启动时,Docker会自动挂载一个空的卷(或之前关联的数据卷)覆盖这个目录,导致你构建时复制的文件“消失”了。

解决方案:在容器启动时复制证书+修改配置

我们需要把证书生成到非VOLUME目录,然后在容器启动脚本里完成证书复制和HTTPS配置,而不是在构建阶段做这些操作。

第一步:修改Dockerfile

FROM apache/nifi:latest
USER root
WORKDIR /opt/nifi/nifi-current

# 用tls-toolkit生成证书到临时目录(避开VOLUME),指定自定义密码可选(这里用nifi123为例)
RUN /opt/nifi/nifi-toolkit-current/bin/tls-toolkit.sh standalone \
    -n "localhost" \
    -C "CN=user_1, OU=NiFi" \
    -P nifi123 \
    -o /tmp/nifi-certs

# 复制自定义启动脚本到容器内
COPY --chown=nifi:nifi start-nifi-with-https.sh /opt/nifi/nifi-current/bin/
RUN chmod +x /opt/nifi/nifi-current/bin/start-nifi-with-https.sh

EXPOSE 19443
USER nifi
ENTRYPOINT ["/opt/nifi/nifi-current/bin/start-nifi-with-https.sh"]

第二步:编写启动脚本start-nifi-with-https.sh

在本地创建这个脚本,和Dockerfile放在同一目录下:

#!/bin/bash
set -e

# 1. 把生成的证书复制到conf目录
cp -fv /tmp/nifi-certs/localhost/* /opt/nifi/nifi-current/conf/

# 2. 修改nifi.properties,禁用HTTP,启用HTTPS
CONF_FILE="/opt/nifi/nifi-current/conf/nifi.properties"

# 清空HTTP端口,禁用HTTP连接器
sed -i 's/^nifi.web.http.port=.*/nifi.web.http.port=/' "$CONF_FILE"
sed -i 's/^nifi.web.http.host=.*/nifi.web.http.host=/' "$CONF_FILE"

# 设置HTTPS端口(当前用19443,后续改9443只需改这里)
sed -i 's/^nifi.web.https.port=.*/nifi.web.https.port=19443/' "$CONF_FILE"

# 配置密钥库/信任库路径和密码(和tls-toolkit指定的密码一致)
sed -i 's/^nifi.security.keystore=.*/nifi.security.keystore=./conf/keystore.jks/' "$CONF_FILE"
sed -i 's/^nifi.security.keystoreType=.*/nifi.security.keystoreType=JKS/' "$CONF_FILE"
sed -i 's/^nifi.security.keystorePasswd=.*/nifi.security.keystorePasswd=nifi123/' "$CONF_FILE"

sed -i 's/^nifi.security.truststore=.*/nifi.security.truststore=./conf/truststore.jks/' "$CONF_FILE"
sed -i 's/^nifi.security.truststoreType=.*/nifi.security.truststoreType=JKS/' "$CONF_FILE"
sed -i 's/^nifi.security.truststorePasswd=.*/nifi.security.truststorePasswd=nifi123/' "$CONF_FILE"

# 3. 启动NiFi(用run模式让进程前台运行,符合容器规范)
/opt/nifi/nifi-current/bin/nifi.sh run

第三步:构建并启动容器

# 构建镜像
docker build -t my_nifi .

# 启动容器(不要设置NIFI_WEB_HTTP_PORT环境变量!)
docker run --name my_nifi -p 19443:19443 -d my_nifi

问题2:手动复制后重启,出现HTTP/HTTPS冲突错误

这个问题的核心是:你启动容器时还设置了NIFI_WEB_HTTP_PORT='19443'环境变量,它会强制覆盖nifi.properties里的HTTP配置,导致NiFi同时尝试启动HTTP和HTTPS连接器。

解决方案:彻底禁用HTTP

  1. 移除启动命令中的-e NIFI_WEB_HTTP_PORT='19443'参数
  2. 确保nifi.properties中以下配置正确:
    nifi.web.http.port=
    nifi.web.http.host=
    nifi.web.https.port=19443
    

按上面的启动脚本配置后,这些都会自动处理,不需要手动修改。

后续切换到9443的注意事项

只需要做两处修改:

  1. 启动脚本里的nifi.web.https.port=19443改成9443
  2. 启动容器时的端口映射改成-p 9443:9443

内容的提问来源于stack exchange,提问作者Blueko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:29:37