前言
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 用户都可以安装使用,安装过程进行了以下几步:
-
把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/
并创建 一个 shell 的 alias,例如 .bashrc
,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
-
自动为你创建 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install
curl https://get.acme.sh | sh -s email=my@example.com
email 替换成你自己的邮箱
普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:
-
把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/
并创建 一个 shell 的 alias,例如
.bashrc
,方便你的使用:alias acme.sh=~/.acme.sh/acme.sh
-
自动为你创建 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;
}
}
申请多域名 SSL 证书
多域名证书(SAN 证书): 颁发包含多个域的单个证书。例如,一个证书可以同时保护 www.example.com
、blog.example.com
、example.net
和 shop.example.org
等不同的域名或子域名。
acme.sh --issue -d example.com -d www.example.com --nginx /etc/nginx/nginx.conf
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;
}
}
申请多域名 SSL 证书
多域名证书(SAN 证书): 颁发包含多个域的单个证书。例如,一个证书可以同时保护 www.example.com
、blog.example.com
、example.net
和 shop.example.org
等不同的域名或子域名。
acme.sh --issue -d example.com -d www.example.com --nginx /etc/nginx/nginx.conf
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;
}
}
多域名证书(SAN 证书): 颁发包含多个域的单个证书。例如,一个证书可以同时保护
www.example.com
、blog.example.com
、example.net
和shop.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 配置:
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
的通知了。
最新评论
确认成功了,第五步确认已经修改完成了,可是还是不能再群晖控制面板里面网络关闭代理,不然docker注册表依然访问不了。拉去速度未有改善,我之前就是群晖网络添加代理,然后注册表同时添加镜像,我不知道现在
这可是个好东西啊,网站收藏了,抽空搞个VPS
那个国家选错了可以更改吗?
设备限制支持5个设备,我5个设备已经用满了,并且有一个设备不用了,怎么更换设备呢,怎么将不用的设备解绑呢?
还是不行,用了一天443端口就被墙了,防火墙似乎对这个端口特别敏感
服了 刚好是华为用户 请问该怎么办?