ACME签发

确保域名已经指向服务器IP, 如果采用 CloudFlare 等 CDN 隐藏真实IP地址需要先关闭.

初始化安装

这里用 root 权限来挂起这些服务, 主要是方便直接一键处理, 具体正式环境的实际最好创建低权限账号来调用.

首先是官方脚本安装, 输入以下命令行:

1
2
sudo apt install -y socat curl # 安装网络请求软件
sudo curl https://get.acme.sh | sh # 下载并安装 acme 脚本

sudo 代表使用最高权限安装, 会在生成的应用配置软件会在其家目录之中, 这也就是提到的可能涉及安全的点.

所有操作步骤没报错的时候, 就可以进行下一步配置命令:

1
2
acme.sh --set-default-ca --server letsencrypt # 切换证书源为 letsencrypt 而非 zerossl( zerossl需要邮箱认证 )
acme.sh --upgrade --auto-upgrade # 设置自动升级更新

这一步还是比较重要的, 新版本的 acme 里面默认配置 ZeroSSL 服务器作为证书服务器, ZeroSSL 是需要邮件手动去认证的, 很可能按照老版本操作过程没办法申请证书.

证书认证

默认的有的认证方式:

  • HTTP认证, 会在访问 HTTP:80(要求必须已经开放80端口服务) 访问目录生成一个 .wellxxxx 的文件夹提供认证.
  • DNS认证, 需要在域名解析商手动添加一条 TXT 的解析记录认证, 比较繁琐.

这里假设已经申请的域名为 demo.example.com, 首先申请证书输入以下命令:

1
2
# 类似于命令: acme.sh --issue -d <域名> --webroot <网站根目录> --nginx /etc/nginx/nginx.conf
acme.sh --issue -d demo.example.com --webroot /data/www/demo --nginx /etc/nginx/nginx.conf

这里会在网站根目录生成一个 .wellxxxx 的文件夹提供给证书服务商确认域名归属, 当出现以下字样代表成功认证:

1
2
3
4
5
[Mon Dec  6 14:36:36 CST 2021] Your cert is in: /root/.acme.sh/demo.example.com/demo.example.com.cer
[Mon Dec 6 14:36:36 CST 2021] Your cert key is in: /root/.acme.sh/demo.example.com/demo.example.com.key
[Mon Dec 6 14:36:36 CST 2021] The intermediate CA cert is in: /root/.acme.sh/demo.example.com/ca.cer
[Mon Dec 6 14:36:36 CST 2021] And the full chain certs is there: /root/.acme.sh/demo.example.com/fullchain.cer
[Mon Dec 6 14:36:36 CST 2021] _on_issue_success

此时证书已经通过证书提供商认证, 可以准备安装并使用该证书了.

安装证书

现在已经证书批下来了, 假设存放的证书目录为 /data/https, 确保目录存在之后执行命令:

1
2
# 类似于: acme.sh --installcert -d <申请证书域名> --key-file <域名证书KEY> --fullchain-file <域名证书> --reloadcmd "<续签执行证书的执行系统命令>"
acme.sh --installcert -d demo.example.com --key-file /data/https/demo.example.com.key --fullchain-file /data/https/demo.example.com.cer --reloadcmd "systemctl restart nginx"

如果没有什么问题, 现在 /data/https 目录下应该有以下文件:

  • demo.example.com.key
  • demo.example.com.cer

安全加固( dhparam,可选步骤 )

这个步骤并不是必须的, 用于增强证书 SSL 的安全性来保证不会被窃取密钥, 多域名共用同个也可以, 直接输入命令:

1
2
# openssl dhparam -out <输出目录文件> <加密强度:2048|4096,数值越高安全性越高,性能消耗越高>
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

使用证书(Nginx)

这里直接在 Nginx 配置文件抄写上内容即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 原生默认访问 http 会自动跳转 HTTPS
server {
listen 80;
server_name demo.example.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
# HTTPS 监听访问
server {
listen 443 ssl http2;
server_name demo.example.com;

# 启用申请的证书
ssl_certificate /data/https/demo.example.com.cer;
ssl_certificate_key /data/https/demo.example.com.key;

# 启用安全加固认证
ssl_dhparam /etc/nginx/ssl/dhparam.pem;

# HTTPS 参数配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers '[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES';
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;

# 其他略.....
}

重启 Nginx 再试下访问下, 确认能访问 HTTPS 即可生效.

清理自动签名

如果有的域名已经无效了, 想要清楚该域名的自动签发则需要运行以下命令:

1
2
acme.sh --list # 查看目前监控的所有自动签发证书
acme.sh --remove -d demo.example.com # 手动清除指定域名证书