我有一个 Ubuntu 服务器 16.04 VPS 和 Nginx。现在我正在实现 HTTP1(不带 TLS,利用端口 80),但我希望“向前迈出一步”并使用 HTTP2(带 TLS,利用端口 443),用于我的所有 (Wordpress) 网站。
假设我调整了我的环境,这样:
1. 防火墙
ufw app list # Choose Nginx HTTPS
2. 服务器块
默认服务器块
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name server_domain_or_IP;
return 302 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
}
每个站点服务器块
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html/example.com;
index index.php index.html index.htm index.nginx-debian.html;
example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
现在我需要创建 OpenSSL 证书,使用 Let'sEncrypt 对其进行签名,并将它们分别与每个站点目录关联。
我的问题:
如何从终端内部尽可能自动地创建 OSSL 证书、LE 标牌和 SDIR 关联?当然,在某些部分我需要从我的电子邮件验证域,但除此之外,AFAIU,一切都是从终端完成的,因此可以完全自动化。
make
您能否分享有助于实现这一目标的Bash 脚本代码示例(或特定实用程序的利用,可能是 GNU )?
笔记
我谦虚地更喜欢无码头解决方案(我在这里读到事实上,它与更新有关,它似乎也实现了 docker,我无意通过极简主义的方式为少于 10 个小站点的小型私人服务器做这件事)。
我知道创建、签名和站点目录关联需要与续订不同的算法。我只要求创建、签名和关联。
为什么我还要问这个问题:
好吧,我只是想在我的自我管理、最小的 VPS 上使用 HTTP2(没有内核/外壳定制、没有编译、几乎没有 contrib 实用程序),对我来说,为许多站点或每次手动实现此算法似乎很疯狂添加了一个新站点。
答案1
使用dehydrated
(https://github.com/lukas2511/脱水)。
您必须/.well-known/acme-challenge/
为每个站点添加位置,因为 Let's Encrypt 服务将查看此位置下的质询响应,以验证您是否是已请求证书的站点的所有者:
location /.well-known/acme-challenge/ { allow all; root /st/hosting/hamilton/htdocs; }
并在脱水配置中使用相同的路径:
egrep -v "^#|^[[:space:]]*$" config
WELLKNOWN="/st/hosting/hamilton/htdocs/.well-known/acme-challenge"
CONTACT_EMAIL=<you@email>
之后,将所有域放入domain.txt
文件中:在每一行上,第一个域将是CommonName
,其他名称将是AlternativeNames
,例如:
head -n1 domains.txt
hamilton.rinet.ru jenkins.hamilton.rinet.ru munin.hamilton.rinet.ru
之后,您应该放入dehydrated -c
cron 并使用如下脚本来安装新生成的证书:
#!/bin/sh
CERTS_DIR=/usr/local/etc/dehydrated/certs
NGINX_SSL=/usr/local/etc/nginx/ssl
DOMAINS=$(awk '{ print $1 }' /usr/local/etc/dehydrated/domains.txt)
for d in $DOMAINS; do
short_d=${d%%.rinet.ru}
short_d=${short_d%%.ru}
# short_d=${short_d##www.}
cp -v ${CERTS_DIR}/$d/fullchain.pem ${NGINX_SSL}/${short_d}.crt
cp -v ${CERTS_DIR}/$d/privkey.pem ${NGINX_SSL}/${short_d}.key
done
# Also update certs for Dovecot
cp -v ${CERTS_DIR}/hamilton.rinet.ru/fullchain.pem /usr/local/etc/dovecot/certs/certs/server.crt
cp -v ${CERTS_DIR}/hamilton.rinet.ru/privkey.pem /usr/local/etc/dovecot/certs/private/server.key
答案2
首先,我会检查一些LetsEncrypt客户端。特别是为 Nginx 列出的那些。我会在重新发明轮子之前从这里开始,因为您最初想使用 LE 签名的证书。
相反,如果您想使用 OpenSSL 创建自签名证书,则可以循环遍历域名列表,并openssl
使用类似于以下内容的命令对每个域执行:
openssl req -x509 -newkey rsa:2048 -keyout examplekey.pem -out examplecert.pem -nodes -days 365 -set_serial NNNNN -subj "/C=US/L=Any City/OU=FooBar Inc/CN=*.example.com"
当然,对于您想要更改的每个域examplekey.pem
,examplecert.pem
、 和*.example.com
。替换NNNNN
为序列号,循环的每次迭代都会递增。
您应该能够轻松编写一个脚本来循环所需的域名并更新各种 Nginx 配置文件。
答案3
我会添加阿克梅工具到了让我们在这里加密客户端的环节,一旦你给它提供了路径,事情就变得非常简单。 acmetool want www.site1.org
acmetool want www.site2.net
您必须使用 nginx 中的 location {} 块将 acme 请求指向正确的位置...如果您愿意,它可以通过 cron 处理更新。
答案4
使用certbot --nginx -d your.domain.name
应该可以解决问题,并且 certbot 应该自动更新您的 nginx 配置
好的,在您完成虚拟主机设置后,您可以为将使用 ssl 命令的每个域运行该命令,certbot --nginx -d your.domain.name
该命令会问您几个问题并生成正确的配置文件。或者,certbot --nginx
如果 nginx 上已有主机名,则可以直接运行。它将自动包含 nginx 的配置文件,旧的配置文件将保存为 .old。
您也可以查看这个教程:https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04 不要忘记使用 certbot --renew 添加 crontab。