子域名的 https 重定向到主域名 - nginx 上的 certbot

子域名的 https 重定向到主域名 - nginx 上的 certbot

我正在运行 nginx,想请您帮忙解释如何设置正确的配置。我不是服务器维护专家,想避免错误配置正在运行的网站。

以下是 nginx 配置的摘录(我认为相关的部分):

server {

    server_name www.sub.example.com;
    return 301 $scheme://sub.example.com$request_uri;
}

server {

    listen 7000;
    server_name example.com;
...

    #listen 443 ssl; # managed by Certbot
    #ssl_certificate /etc/letsencrypt/live/nifty.works/fullchain.pem; # managed by Certbot
    #ssl_certificate_key /etc/letsencrypt/live/nifty.works/privkey.pem; # managed by Certbot
    #include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

and a proxy server like:


# Virtualhost/server configuration
server {
    listen  80;
    server_name sub.example.com;

..

}

我正在使用 certbot,我记得我尝试自动设置证书,但遇到了一个问题,如果我没记错的话,我使用通配符证书成功地为主站点正确安装了 SSL 证书。

证书昨天已过期,我更新了它,以帮助自己:

certbot renewal

https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx

并且可以看到它与主站点运行正常。

但是,对于子网站,https://sub.example.com点将显示主网站https://example.com(注意,这是不是重定向),而http http://sub.example.com显示正确的站点。

sudo certbot certonly --nginx可以看到要激活 https 的子域列表。

在篡改之前我想问你:

您能帮我简要介绍一下如何为子域设置正确的 SSL 配置吗?

请注意,所有子域都使用 API(大部分是 GET,少数是 POST):我担心会破坏网站(后端在 flask python 中,可能希望避免设置用户凭据 - 它只是一个开放的网站,带有一些来自社交的共享插件)。

答案1

这完全是 NGINX 配置的错误,它的行为按照 certbot / 您自己配置的进行。

当 NGINXserver部分侦听某个端口时,如果它是仅有的监听该端口的服务将成为默认服务器块匹配该端口。这是设计使然。

你需要分离在您的子域的配置部分中使用有效的 HTTPS 配置和证书来向https://sub.example.com/转到正确的文档根目录。

此配置示例(除了两个服务器块都提供 HTTP 和 HTTPS 服务而不需要扩展服务器配置的数量):

server {
    listen 80 default_server;
    listen 443 default_server;

    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    root /var/www/example.com;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    # ... other config here
}

server {
    listen 80;
    listen 443 ssl;

    server_name sub.example.com;

    ssl_certificate /etc/nginx/ssl/sub.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/sub.example.com.key;

    root /var/www/sub.example.com;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    # other configuration for site here

}

当你请求时https://sub.example.com,它会匹配 HTTP 和 HTTPS 上的第二个站点的配置,因为两个都该服务器块已配置 HTTP 和 HTTPS 侦听器。https://foo.example.com但是,如果您发出请求,它将回退到具有 default_server 块的服务器,该服务器为 443 侦听器提供服务,example.com而不是子域。

本质上,您需要有一个自定义配置,在端口 443 上为您的子域提供 certbot 证书才能正常工作。不幸的是,您不能使用certbot nginx安装程序来执行此操作,并且需要将 certbot 配置为使用 standalone/webroot 模式来处理您的证书,然后手动配置 NGINX 以获取正确的 SSL 证书路径(以及随之而来的 .well-known 握手)。

关于如何使用独立/webroot 模式的 Certbot 配置如下: https://certbot.eff.org/docs/using.html#webroot

您需要使用此方法为您的 nginx 配置配置两个单独的 SSL 文档根/域,然后配置您的 NGINX ssl_certificate 路径以指向磁盘上的 Lets Encrypt 路径。(这个过程太长,无法用一个答案来概括,但如果您愿意,我可以创建一个聊天室来指导您完成这个过程)

相关内容