Let's Encrypt 泛域名证书申请及配置

file

Let's Encrypt 在今年 3 月份就已经推出泛域名证书支持了,以前我一直是使用的单域名证书,加上站点开启了 HSTS 支持,当新增网站应用时不得不为其单独申请证书,十分不便。

目前比较常用的为 Let's Encrypt 生成证书的工具比较多,如

这里我们将使用 acme.sh 这个工具来安装 Let's Encrypt 证书。acme.sh 是一个非常优秀的证书生成工具,其 官网 更是有详细的中文文档支持 。

安装

你可以通过下面的脚本来安装 acme.sh

curl  https://get.acme.sh | sh

该操作需要服务器支持 socatcurl 模块。(apt install socat curl)

安装成功后,会在当前文件夹下生成 .acme.sh 文件夹。

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证: httpdns 验证。由于泛域名证书的解析目前仅支持 DNS 方式验证,下面我们将通过 DNS 方式来验证你的域名所有权。

acme.sh  --issue  --dns  -d godruoyi.com -d *.godruoyi.com

这种方式会将相应的解析记录显示出来,然后你需要在你的域名管理面板中添加这条 txt 记录。并等待解析完成之后,重新用下面命令生成证书:

acme.sh  --renew   -d mydomain.com

注意第二次这里用的是 --renew,当然我们并不想这么麻烦,dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。

根据你的域名服务商类型,选择对应的 DNS API。如

1、腾讯云

这里申请 API Token,获取到 IDToken 后执行:

file

export DP_Id="id"
export DP_Key="token"

2、阿里云

这里申请阿里云 Accesskey

file

获取到 KEYSecret 后执行下面命令:

export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"

3、生成证书

在配置好上述设置后,就可通过

.acme.sh/acme.sh --issue --dns dns_dp -d godruoyi.com -d *.godruoyi.com

来生成证书,注意这里第一个域名为顶级域名,后面个为泛域名。

这种方式将自动为你的域名添加一条 txt 解析,验证成功后,这条解析记录会被删除,所以对你来说是无感的,就是要等 120秒

证书生成成功后,默认保存在 .acme.sh/你的顶级域名 中。

配置 Nginx

下面我们来为 Nginx 配置 SSL 证书支持。

1、移动下列证书到 /etc/nginx/ssl 文件夹,若无该文件夹,自行创建。

cp ~/.acme.sh/godruoyi.com/fullchain.cer /etc/nginx/ssl/fullchain.cer
cp ~/.acme.sh/godruoyi.com/godruoyi.com.key /etc/nginx/ssl/godruoyi.key

2、新建 ssl-params.conf 并把它放到 Nginx 的 snippets 目录中。

下面的这些配置来自 提高安全性的最佳 Nginx 配置,建议参考。

# /etc/nginx/snippets/ssl-params.conf

server_tokens   off;

ssl_session_cache        shared:SSL:10m;
ssl_session_timeout      60m;

ssl_session_tickets      on;

ssl_stapling             on;
ssl_stapling_verify      on;

resolver                 8.8.4.4 8.8.8.8  valid=300s;
resolver_timeout         10s;
ssl_prefer_server_ciphers on;

# 证书路径 绝对地址
ssl_certificate          /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key      /etc/nginx/ssl/godruoyi.key;

ssl_protocols            TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";

3、接下来在 Nginx 主配置文件中开启 SSL 支持

# /etc/nginx/nginx.conf

http {
    ....
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

完整的 Nginx 配置文件请参考 我的 Nginx 配置

4、配置虚拟主机

# /etc/nginx/sites-available/godruoyi.com

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name godruoyi.com www.godruoyi.com;
    return 301 https://$server_name$request_uri;
}

server {
    # 注意我们设置该站点为默认站点,并移除了 nginx 默认的 default 配置
    listen 443 ssl http2 fastopen=3 reuseport default_server;
    listen [::]:443 ssl http2 fastopen=3 reuseport default_server;

    server_name www.godruoyi.com godruoyi.com;

    # 引入 SSL 及 PHP 配置
    include snippets/fastcgi-php.conf;
    include snippets/ssl-params.conf;

    root /home/godruoyi/websites/godruoyi.com/public;

    access_log /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-access.log;
    error_log  /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-error.log error;

    index index.php;

    # 当访问域名是不  godruoyi.com 强制跳转到 https://godruoyi.com
    if ($host != 'godruoyi.com' ) {
        rewrite ^/(.*)$ https://godruoyi.com/$1 permanent;
    }
}

再来看一个 admin.godruoyi.com 的配置

# /etc/nginx/sites-available/admin.godruoyi.com

server {
    listen 80;
    listen [::]:80;

    server_name admin.godruoyi.com;
    return 301 https://$server_name$request_uri;
}
server {
    # 如果多个域名配置在同一主机,这里只需要监听到 433 就可以了,
    # 不需要再添加 ssl http2 fastopen=3 reuseport default_server 之类的了
    listen 443;      
    listen [::]:443;

    root /home/godruoyi/websites/admin.godruoyi.com/public-admin;

    access_log /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-access.log;
    error_log  /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-error.log error;

    server_name admin.godruoyi.com;

    index index.php;

    client_max_body_size 20M;

    include snippets/fastcgi-php.conf;
    include snippets/ssl-params.conf;

    if ($host != 'admin.godruoyi.com' ) {
        rewrite ^/(.*)$ https://admin.godruoyi.com/$1 permanent;
    }
}

4、虚拟主机配置完成,接下来为其配置软连接测试成功后就可以重启 Nginx 啦。

sudo ln -s /etc/nginx/sites-available/godruoyi.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/admin.godruoyi.com /etc/nginx/sites-enabled/

# 测试配置是否成功
sudo nginx -t

sudo service nginx restart

以上所有配置你都可以在 这里 找到,别忘了点颗小星星哟 :smile:

文章首发于 二楞的闲谈杂鱼


参考链接

本作品采用《CC 协议》,转载必须注明作者和本文链接
二愣的闲谈杂鱼
本帖由 Summer 于 5年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 26

这个好,赞

5年前 评论
Destiny

一直都用的 acme.sh

5年前 评论
godruoyi

@fanly :+1: :+1: :+1:

5年前 评论
godruoyi

@Destiny 是呀,自从发现了这个工具,就再也不担心不会配置啦 :see_no_evil:

5年前 评论

这个,我再顶一下,免得不好找。

5年前 评论
mouyong

好详细啊

5年前 评论
oyghan

Let's Encrypt域名证书的有效期不是3个月的吗,这个问题有什么更方便的解决方案吗?@godruoyi

5年前 评论

这个配置应该是支持 ipv6 的吧 :flushed:

5年前 评论
godruoyi

@oyghan 按照 官方文档,在生成好证书后,通过以下命令来迁移证书

acme.sh  --installcert  -d  <domain>.com   \
        --key-file   /etc/nginx/ssl/<domain>.key \
        --fullchain-file /etc/nginx/ssl/fullchain.cer \
        --reloadcmd  "service nginx force-reload"

值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.

5年前 评论
sunny123456 3年前
sunny123456 3年前
godruoyi (作者) (楼主) 3年前
godruoyi

@Ken 是的呢,

5年前 评论
oyghan

@godruoyi 谢谢,已经搞明白了。

5年前 评论

no matches found: *.a.com

5年前 评论

:joy:并没有出现.acme.sh

5年前 评论
godruoyi

@Andy_xiaojun 是不是没安装成功哟,安装成功后会有一个 .acme.sh 目录的哟

5年前 评论
godruoyi

@Andy_xiaojun 是的呢 :+1:

5年前 评论

@godruoyi 哈哈哈,就是木有目录

5年前 评论

@godruoyi 卧槽,居然可以了。。。

5年前 评论

我用 certbot-auto,www 和不带 www 需要配置不同的证书。
一会用你的试试。

5年前 评论

当执行以下命令时出现下面这个,作者知道什么意思吗?

acme.sh  --issue  --dns  -d godruoyi.com -d *.godruoyi.com

file

5年前 评论
godruoyi

@Flourishing

.acme.sh/acme.sh --issue --dns dns_dp -d godruoyi.com -d *.godruoyi.com

采用 dns 模式时需要指定 dns_dp 参数,你是不是忘记了啊

5年前 评论
Toiu

如果是阿里云时 生成证书这里应该改为 .acme.sh/acme.sh --issue --dns dns_ali -d godruoyi.com -d *.godruoyi.com

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!