【问题标题】:Enable HTTPS for Nginx docker container为 Nginx docker 容器启用 HTTPS
【发布时间】:2020-08-03 11:06:33
【问题描述】:

对于开发环境,我需要启用与 Nginx 容器的 SSL 连接。

我收到了一个从 Azure Key Vault 生成的证书,它采用 PFX 格式。

我一直在尝试在我的 nginx 容器中安装 opensll,并从 PFX 生成一个 crt 和密钥文件,但没有任何运气。

启用 HTTPS 连接到我的 NGINX 容器的最简单方法是什么?

这是我从现在开始的非工作 dockerfile。

FROM nginx:1.17.1-alpine
ARG CERT
RUN apk upgrade --update-cache --available && \
    apk add openssl && \
    rm -rf /var/cache/apk/*

RUN echo "$CERT"
RUN test -z "$CERT" || echo "$CERT"  && echo "no certificates setup"
COPY cert.pfx /opt/certificate.pfx
RUN mkdir /etc/nginx/certs

RUN test -z "$CERT" || openssl pkcs12 -in /certificate.pfx -nocerts -out /etc/nginx/certs/cert.key -password pass:FakePassword && :
RUN test -z "$CERT" || openssl pkcs12 -in /certificate.pfx -clcerts -nokeys -out /etc/nginx/certs/cert.crt -password pass:FakePassword && :
RUN test -z "$CERT" || echo $'server { \n\
                                    \tlisten 443 ssl; \n\
                                    \tserver_name  www.yoursite.com; \n\
                                    \tssl_certificate /etc/nginx/certs/cert.crt; \n\
                                    \tssl_certificate_key /etc/nginx/certs/cert.key; \n\
                                    \tlocation / { \n\
                                        \t\tproxy_pass http://frontend:5000/; \n\
                                        \t\terror_log /var/log/front_end_errors.log; \n\
                                    \t} \n\
                              }' >> /etc/nginx/conf.d/nginx.conf
EXPOSE 80 443

COPY --from=build /app/dist /usr/share/nginx/html/

我的错误是:

Step 18/25 : RUN if [ "x$CERT" = "x" ] ; then : ; else openssl pkcs12 -in /opt/certificate.pfx -nocerts -out /etc/nginx/certs/cert.key ; fi
 ---> Running in f5d8b255e51c
Enter Import Password:
Can't read Password
The command '/bin/sh -c if [ "x$CERT" = "x" ] ; then : ; else openssl pkcs12 -in /opt/certificate.pfx -nocerts -out /etc/nginx/certs/cert.key ; fi' returned a non-zero code: 1

【问题讨论】:

  • 我认为 openssl 期望用户输入密码。由于它在构建 docker 映像时无法工作,因此您可以使用 -password stdin 从标准输入管道输入密码(检查此以获取更多选项:stackoverflow.com/questions/27022180/…

标签: azure docker nginx ssl-certificate


【解决方案1】:

可能不是您想听到的,但您提出的解决方案是危险到非常危险的,具体取决于用例。您正在做的是将证书烘焙到图像本身中。证书和其他机密应作为 Docker 卷挂载,因此在您的情况下,将 /etc/nginx/certs 设置为卷会更好地解决您的问题

根据您编排容器的方式,有多种方法可以将 SSL 证书放入容器。由于您使用“Azure”标记,我假设您使用 Azure Kubernetes 服务或 Azure 容器实例。在 AKS 中,有很多方法可以做到这一点,但一种常见的方法是创建一个 init 容器,为其提供对密钥保管库的访问权限,然后将密钥直接从密钥保管库加载到共享 (tmpfs) 卷中。

在容器实例中,您可以在运行时通过将容器权限分配给密钥保管库(类似于在 AKS 中执行此操作)直接从密钥保管库读取机密,在 Docker 中创建入口点脚本将证书下载到临时卷然后启动 nginx 的图像。

无论您选择哪种方式:永远不要将密钥从密钥保管库保存到任何类型的存储中。

有关如何使用 curl 在运行时从容器内的 Azure 密钥保管库下载机密的示例,请参阅 this page

【讨论】:

  • 好的,感谢您的意见。我会试试这个......我并不担心测试,因为我只是在我们的测试环境中使用它来模拟服务。无论如何,我会以正确的方式来做,因为我们使用我们的测试用例作为我们生产的学习曲线。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多