安装
首先需要安装 acme.sh,只需执行以下命令即可安装:
curl https://get.acme.sh | sh -s [email protected]
在 Ubuntu 上执行以上命令即可。该命令会将 acme.sh 安装到用户目录下,并将其隐藏。可以通过 ls -a
命令查看 .acme.sh
目录。
安装后配置
安装完成后,可能需要执行以下命令创建 acme.sh
的别名:
alias acme.sh=~/.acme.sh/acme.sh
这步操作避免了 acme.sh: command not found
的问题。
认证
acme.sh 提供了三种证书认证方式:
- HTTP 方式:需要在你的网站根目录下放置一个文件来验证你的域名所有权。
- 手动 DNS 方式:手动在域名上添加一条 TXT 解析记录,验证域名所有权。
- DNS API 自动验证:通过 DNS 服务商的 API 自动添加 TXT 记录来完成验证。此方法较为简单且推荐使用。
我们选择了 DNS API 自动验证。acme.sh 支持多个 DNS 服务商,如 Cloudflare、DNSPod、CloudXNS、GoDaddy 和 OVH 等。
获取 DNS 服务商 Token(以 DNSPod 为例)
- 登录 DNSPod 后台。
- 点击右上角头像,选择 DNSPod Tokens。
- 点击 创建密钥,并记录下生成的 ID 和 Token 值。请注意 Token 只显示一次,务必备份。
设置 DNSPod Token
在命令行中执行以下命令来设置 Token(注意格式不要出错):
export DP_Id="your_id"
export DP_Key="your_token"
生成证书
生成证书时,先添加主域名,再添加泛域名。可以使用 -d
参数添加多个域名。执行以下命令来生成证书:
acme.sh --issue --dns dns_dp -d aa.com -d *.aa.com
证书文件将会自动存放在 ~/.acme.sh
目录下,文件夹名称为主域名。
安装证书到 Nginx
虽然有教程建议直接 cp
证书文件到 Nginx 的证书目录,但根据官方说明,最好通过命令来安装证书,以便于自动续期和更新。
执行以下命令安装证书:
acme.sh --install-cert -d example.com \
--key-file /youdata/ssl/nginx/yourdomain.key \
--fullchain-file /youdata/ssl/nginx/fullchain.cer \
--reloadcmd "sudo nginx -s reload"
这样可以自动将证书文件安装到指定目录,并设置重载命令。
自动续期
安装时,acme.sh 会自动设置一个 cron
任务,每天检查证书是否需要续期。如果需要,acme.sh 会自动续期证书。可以通过 crontab -l
查看现有的计划任务。
默认的 cron
配置如下:
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Nginx 配置
首先,在 /etc/nginx/snippets
目录下创建一个 ssl-params.conf
文件,专门配置 SSL 相关的设置,内容如下:
# /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 /youdata/ssl/nginx/fullchain.cer;
ssl_certificate_key /youdata/ssl/nginx/yourdomain.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:";
然后,新建一个 Nginx 配置文件,配置 server
项,并通过 include
导入我们之前写的 SSL 配置代码段:
server {
listen 443 ssl;
server_name test.yourdomain.com;
include snippets/ssl-params.conf;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:15215;
# 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
# client_max_body_size 20000m;
}
location ~ /.well-known {
allow all;
}
client_max_body_size 50m;
}