欢迎光临
我们一直在努力

acme.sh + nginx 免费申请 SSL 域名证书

前言

SSL 证书能帮助网站保持安全,但申请和管理 SSL 证书让人头疼。幸运的是,acme.sh 提供了一个简单的方法来自动处理这些任务。这篇文章将带你一步步了解如何在 Nginx 服务器上使用 acme.sh 申请和配置 SSL 证书,设置自动更新和通知,省去繁琐的手动操作。

安装和配置

acme.sh 项目地址:https://github.com/acmesh-official/acme.sh

安装 acme.sh:

curl https://get.acme.sh | sh -s [email protected]

email 替换成你自己的邮箱

普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:

  1. 把 acme.sh 安装到你的 home 目录下:

    ~/.acme.sh/

    并创建 一个 shell 的 alias,例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

  2. 自动为你创建 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

使别名生效:

source ~/.bashrc

申请证书

创建一个存放 SSL 证书的目录:

mkdir -p /etc/nginx/ssl/example.com

注意:

确保你的域名目前 80 端口有配置 Server,如果 80 端口配了如下重定向:

# 检查你的 Nginx 配置,不要使用这种重定向配置,否则会导致申请域名失败。
server {
    listen 80;
    server_name  www.example.com;
    return 301 https://$host$request_uri;
}
# 检查你的 Nginx 配置,不要使用这种重定向配置,否则会导致申请域名失败。
server {
    listen 80;
    server_name  www.example.com;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

上面这种重定向配置方式优先级比 acme.sh 生成的域名所有权验证配置更高,
所以如果你使用了上面这种重定向方式的话,就得改为下面这种写法:

# 正确配置一:
server {
    listen 80;
    server_name www.example.com;

    location / {
         return 301 https://$host$request_uri;
    }
}
# 正确配置一:
server {
     listen 80;
     server_name www.example.com;

     location / {
        rewrite ^(.*)$ https://${server_name}$1 permanent;
     }
}

参见:https://github.com/acmesh-official/acme.sh/issues/5058

申请多域名 SSL 证书

多域名证书(SAN 证书): 颁发包含多个域的单个证书。例如,一个证书可以同时保护 www.example.comblog.example.comexample.netshop.example.org 等不同的域名或子域名。

acme.sh --issue -d example.com -d www.example.com --nginx /ect/nginx/conf/nginx.conf

证书文件会被 copy 到相应的位置,并重新加载 Nginx 配置

acme.sh --install-cert -d example.com 
 --key-file       /etc/nginx/ssl/example.com/key.pem  
 --fullchain-file /etc/nginx/ssl/example.com/cert.pem 
 --reloadcmd     "service nginx reload"

证书颁发后,acme.sh 会恢复你的 nginx conf,不用担心。

更多颁发证书的方式可以参考:https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

配置证书:

好了到这里因该就成功申请证书了,你可以在你的 Nginx Server 配置中引用证书文件。例如,修改你的 Nginx 配置:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;

    # 通过指定的证书链,Nginx 能够验证 OCSP 响应的真实性和完整性,确保响应确实来自可信的 CA。
    ssl_trusted_certificate /etc/nginx/ssl/example.com/cert.pem;

    # 其他配置...
}

建议使用 Mozilla SSL Configuration Generator 根据你的 nginx、openssl 版本来生成你的 Nginx SSL 配置:

https://ssl-config.mozilla.org/#server=nginx

SSL 服务测试:

https://www.ssllabs.com/ssltest/

acme.sh 常用命令

升级更新 acme.sh:

升级 acme.sh 可以使用以下命令:

acme.sh --upgrade

或者使用自动升级,使用以下命令,有更新就自动更新,不需人工干预:

acme.sh --upgrade --auto-upgrade

要关闭自动升级使用以下命令:

acme.sh --upgrade --auto-upgrade 0

acme.sh 的基本管理:

1、查看 acme.sh 已签发证书的域名:

acme.sh --list

2、查看详细信息:

acme.sh --info -d example.com

3、从 acme.sh 中移除不需要再次签发证书的域名:

acme.sh --remove -d example.com

4、删除 acme.sh:

acme.sh --uninstall

SSL 证书更新通知

我这里使用的 Telegram 通知,其他通知方式请参考:https://github.com/acmesh-official/acme.sh/wiki/notify

通过 Telegram 接收通知,需要在 Telegram 与 @BotFather 对话,来创建一个新的 Telegram 机器人。创建完成后,保存返回的机器人令牌(bot token)。

接下来,你需要获取 Telegram 账号(或群组)的 chat_id。最简单的方法是与新创建的机器人开始对话,并发送一条简单的测试消息。然后,使用 curl 获取 getUpdates API 端点的响应,并在返回的 JSON 对象中查找你发送的消息对应的 chat_id。例如:

$ bot_token="...." # 在这里输入新机器人的 API 令牌。
$ curl -s "https://api.telegram.org/bot${bot_token}/getUpdates" | python -mjson.tool
{
    "ok": true,
    "result": [
        {
            "message": {
                "chat": {
                    "first_name": "Joe",
                    "id": 12345678,            <----- 这是 Chat ID。
                    "last_name": "Bloggs",
                    "type": "private",
                    "username": "joebloggs"
                },
                ......
                "text": "你发送的测试消息的内容",
                ......

$

一旦你获得了 API 令牌和要接收机器人通知的 chat_id,设置以下两个变量,用于通知挂钩脚本:

export TELEGRAM_BOT_APITOKEN="..."   # 上面由 @BotFather 创建机器人时返回的令牌。
export TELEGRAM_BOT_CHATID="..."     # 上面获取到的 Chat ID。

然后设置通知:

acme.sh --set-notify --notify-hook telegram

这样,你就可以通过 Telegram 收到 acme.sh 的通知了。

参考文章

https://www.psay.cn/toss/126.html

赞(0)
未经允许不得转载:拆东墙 » acme.sh + nginx 免费申请 SSL 域名证书

评论 抢沙发

登录

找回密码

注册