如果主证书不存在,如何在 Nginx 中定义后备证书?

如果主证书不存在,如何在 Nginx 中定义后备证书?

通常,当Nginx尝试读取不存在的证书时,它将退出并抛出错误。

我可以定义任何后备证书如果主要证书不存在怎么办?

答案1

不。为什么你的密钥不存在?

答案2

我也遇到了同样的问题。我正在将 Docker 集群部署到生产环境中,我希望为其自动生成 SSL 证书。当 SSL 证书到位时,我想强制所有流量重定向到 https。这不是特别有魅力,但这是我想到的解决方案。

我的 nginx 服务器有 2 个配置文件:app.conf 和 tlsapp.conf

应用程序配置文件

server {
    listen 80;
    server_name example.com;
    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/public;
    }
}

tlsapp.conf

server {
    listen 80;
    server_name example.com;
    location / {
        return 301 https://example.com$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/nginx/opt/options-ssl-nginx.conf;
    ssl_dhparam /etc/nginx/opt/ssl-dhparams.pem;
    root /var/www/public;
    index index.php;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    ...
}

然后我从自定义映像部署我的 nginx 容器。

nginx.Dockerfile

FROM nginx:alpine

COPY docker-config/nginx/conf.d/app.conf /etc/nginx/conf.d/app.conf
COPY docker-config/nginx/conf.d/tlsapp.conf /etc/nginx/conf.d/tlsapp.bkp
COPY docker-config/nginx/opt/ /etc/nginx/opt/
COPY docker-config/nginx/entrypoint.sh /custom-entrypoint.sh

RUN chmod 775 /custom-entrypoint.sh

ENTRYPOINT ["/custom-entrypoint.sh"]
RUN ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

最后,我的自定义 nginx 映像中有一个自定义入口点。基本上,这个入口点所做的就是检查是否已创建 ssl 证书。如果已创建,它将启用 tlsapp 配置并禁用仅用于使用 certbot 引导证书的配置。

入口点

#!/usr/bin/env sh

set -e

if [ -d "/etc/letsencrypt/live" ]; then
    mv /etc/nginx/conf.d/app.conf /etc/nginx/conf.d/app.bkp
    mv /etc/nginx/conf.d/tlsapp.bkp /etc/nginx/conf.d/tlsapp.conf
fi

exec "$@"

此设置允许我的 nginx 容器在未生成 SSL 证书的情况下在新的生产环境中启动。它为 certbot 提供了足够的访问权限,以将证书生成到共享持久卷中。然后我要做的就是重新部署 nginx 容器,它将启动、查看证书并启用我的站点的实际配置,强制所有流量通过 https。

我不喜欢这种设置,因为它需要对新的生产环境进行尴尬的重新部署,如果你的设置比一个应用程序针对一个 nginx 服务器更复杂,可能会出现问题,但它可以工作。

相关内容