将ca证书添加到以指定用户身份运行的Tomcat Docker容器

时间:2018-11-21 13:26:10

标签: docker ssl tomcat ssl-certificate dockerfile

我有一个直接安装到/ usr / local / share / ca-certificates -folder的Docker卷。

certificate-folder:/usr/local/share/ca-certificates:ro

我正在使用Tomcat进行此设置,但是其他框架也可能遇到类似的问题。 Dockerfile的基础是这样的:

FROM       tomcat:8.5-jre8
# other Dockerfile configuration
CMD ["/start.sh"]

start.sh包含关键行

#!/usr/bin/env bash
update-ca-certificates 
# other startup related tasks
catalina.sh run

此设置的问题在于,只要我以root用户身份运行容器,它就可以正常工作。但是,如果我尝试使用类似这样的方法在Dockerfile的末尾更改为指定用户

ENV TOMCAT_USER="tomcat" \
    TOMCAT_UID="8080" \
    TOMCAT_GROUP="tomcat" \
    TOMCAT_GID="8080"
RUN groupadd -r --gid $TOMCAT_GID $TOMCAT_GROUP && \
    useradd -r --uid $TOMCAT_UID --gid $TOMCAT_GID $TOMCAT_USER
RUN chown -R $TOMCAT_USER:$TOMCAT_GROUP /usr/local/tomcat
USER $TOMCAT_USER

所以:

  • 由于外壳程序脚本以$ TOMCAT_USER身份运行,因此无法运行“ update-ca-certificates”来安装证书。
  • 因为未在Dockerfile中添加证书,所以update-ca-certificates无法在Dockerfile中运行。

因此,我最终遇到了这样的SSL问题

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

如果我仍然希望以指定的$ TOMCAT_USER身份运行容器,那么解决此类问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

由于update-ca-certificates需要root权限才能更新/etc/ssl/certs中的证书,因此我只看到三种可能的方法(和一种可行的解决方案-下面的第三种解决方案):

  1. 从入口点删除update-ca-certificates,并在行RUN update-ca-certificates之前添加一个USER $TOMCAT_USER命令。 (但是,您使用的卷在构建时将不可用,因此无法使用…)

  2. 为您的sudo授予$TOMCAT_USER权限(无密码),并将update-ca-certificates替换为sudo update-ca-certificates。 (但是,从安全角度来看,此解决方案可能无法令人满意……)

  3. 从您的Dockerfile中删除USER $TOMCAT_USER;保留CMD ["/start.sh"],如果愿意,请保留ENTRYPOINT ["/start.sh"];并依靠gosu工具,该工具的主要用例就是从 root 降级为非特权用户,同时享有比 sudo w.r.t更好的行为。 TTY和信号转发。

    您只需执行以下操作即可安装gosu

    RUN apt-get update -y -q && \
      DEBIAN_FRONTEND=noninteractive \
      apt-get install -y -q --no-install-recommends gosu
    

    (因为tomcat:8.5-jre8基于Debian),并通过编写以下内容来使用它:

      

    start.sh

    #!/usr/bin/env bash
    update-ca-certificates 
    # other startup related tasks
    exec gosu $TOMCAT_UID:$TOMCAT_GID catalina.sh run