每一个问题都是机会

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

文章目录
  1. 前言
  2. 安装和配置
  3. acme.sh 常用命令
  4. SSL 证书更新通知
  5. 参考文章

前言

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=my@example.com

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 /etc/nginx/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": "你发送的测试消息的内容",
                ......
<snip 剩余输出内容>
$

一旦你获得了 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 域名证书
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址