我还没有真正弄清楚如何使用 certbot 为 nginx 创建(有效的)证书。
我的网站启用现在如下所示:
首先,使用 SSL 阻止 www 域名。所有 SSL 内容均由 certbot 创建。
server {
root …
index …
server_name www.doman.com
listen 443 ssl;
ssl_certificate …
ssl_certificate_key …
include …
ssl_dhparam …
}
此后,www 和非 www 的重定向从端口 80 到端口 443。第一部分(if 语句)是由 certbot 创建的,而不是我创建的。
server {
if ($host = www.example.com {
return 301 https://$host$request_uri;
}
listen *:80;
server_name domain.com www.example.com;
return 301 https://www.example.com$request_uri;
}
最后,阻止不带 www 的 443。我希望将其重定向到 www。
server {
listen 443;
server_name www.domain.com
return 301 https://www.example.com$request_uri;
}
对于带有 www 的域名,此方法效果很好。但是,如果没有 www,我会收到“无法访问此站点”的提示。即使我尝试使用 http 而不是 https 也是如此。
我哪里搞砸了?我猜第三个块(使用 443 表示非 www)也需要 SSL 证书。但我使用 certbots 自动创建,它没有添加任何证书。
答案1
我不允许 certbot 创建我的 Web 服务器配置。坦白说,我不相信它能做对,因为它已经在做一些不太有效的做法了。
所以我获得了证书certbot certonly --webroot -w /var/www -d hostname -d hostname
......
我的 nginx 配置如下(针对一个示例域):
server {
server_name www.yes-www.org yes-www.org;
access_log off;
include includes/listen-80;
include includes/cloudflare;
include includes/letsencrypt;
location / {
return 301 https://$host$request_uri;
}
}
对于端口 80,我只是提供两个主机名并无条件重定向到 https 和 www。
server {
server_name yes-www.org;
access_log off;
ssl_certificate /etc/letsencrypt/live/www.yes-www.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.yes-www.org/privkey.pem;
include includes/listen-443;
include includes/cloudflare;
include includes/ssl;
include includes/hsts;
include includes/letsencrypt;
location / {
return 301 https://www.yes-www.org$request_uri;
}
}
对于非 www 端口 443 我只是无条件重定向到 www。
server {
server_name www.yes-www.org;
root /srv/www/yes-www.org;
access_log /var/log/nginx/yes-www.org-access.log nginx;
access_log /var/log/nginx/cache.log cache;
error_log /var/log/nginx/yes-www.org-error.log;
ssl_certificate /etc/letsencrypt/live/www.yes-www.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.yes-www.org/privkey.pem;
include includes/listen-443;
include includes/cloudflare;
include includes/letsencrypt;
include includes/ssl;
include includes/hsts;
include includes/favicon;
include includes/wordpress;
include includes/php;
include /srv/www/yes-www.org/nginx.conf;
location ~ /\.(ht|git) {
deny all;
}
}
最后,我在这里提供一个网站。
注意的内容/etc/nginx/includes/letsencrypt
是:
location /.well-known/acme-challenge/ {
root /var/www;
try_files $uri =404;
}
这使得certbot certonly
上述工作得以完成。