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

Moh*_*din 6 nginx

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

如果主证书不存在,我可以定义任何后备证书吗?

小智 9

我遇到了同样的问题。我正在将 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我从自定义映像部署 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;"]
Run Code Online (Sandbox Code Playgroud)

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

入口点.sh

#!/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 "$@"
Run Code Online (Sandbox Code Playgroud)

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

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


Tim*_*Tim 0

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

  • 我只是使用“docker-compose”和“certbot”自动生成,后者需要第一个(使用我的自定义自动化配置)。根据我的配置,第一个无法在没有证书的情况下启动。 (4认同)