我正在运行 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 路径。(这个过程太长,无法用一个答案来概括,但如果您愿意,我可以创建一个聊天室来指导您完成这个过程)