在 Nginx 环境中自动创建 OpenSSL 证书、Let'sEncrypt 签名和站点目录关联

在 Nginx 环境中自动创建 OpenSSL 证书、Let'sEncrypt 签名和站点目录关联

我有一个 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 )?

笔记

  1. 我谦虚地更喜欢无码头解决方案(我在这里读到事实上,它与更新有关,它似乎也实现了 docker,我无意通过极简主义的方式为少于 10 个小站点的小型私人服务器做这件事)。

  2. 我知道创建、签名和站点目录关联需要与续订不同的算法。我只要求创建、签名和关联。

为什么我还要问这个问题:

好吧,我只是想在我的自我管理、最小的 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 -ccron 并使用如下脚本来安装新生成的证书:

#!/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.pemexamplecert.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。

相关内容