Marco Nie - acme.sh https://blog.niekun.net/tag/acme-sh/ zh-CN Tue, 19 Feb 2019 09:02:00 +0800 Tue, 19 Feb 2019 09:02:00 +0800 使用acme.sh生成 ssl 证书并部署到 Nginx https://blog.niekun.net/archives/34.html https://blog.niekun.net/archives/34.html Tue, 19 Feb 2019 09:02:00 +0800 admin acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.

官方说明:https://github.com/Neilpang/acme.sh

安装acme.sh

安装很简单:

apt-get install curl
curl  https://get.acme.sh | sh

安装过程进行了以下几步:

  • 把 acme.sh 安装到你的 root 目录下: /root/.acme.sh/
  • 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
  • 在 /root/.bashrc 创建 一个 bash 的 alias: alias acme.sh="/root/.acme.sh/acme.sh"

cronjob 的任务可以使用命令 crontab -e 查看。

新版的acme.sh是在 .bashrc 里引用了. "/root/.acme.sh/acme.sh.env",此文件里定义了上面的alias。
如果安装完成后无法运行命令:acme.sh,试着运行:source ~/.bashrc重新加载alias,或者检查此文件内容。

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。dns 验证可以生成泛域名的证书,更加方便的适用于二级域名。

http 方式

需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.

acme.sh  --issue  -d domain.you -d www.domain.you -d abc.domain.you --webroot  /your/www/root

只需要指定域名, 可以同时生成多个域名到一个证书,并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.

dns 方式

可以使用域名解析服务商的 api 来解析,我使用的是 cloudflare 作域名解析,进入 cf 的对应域名,在网站右下角有 account ID,记录下来,然后点击 get your api token:
2020-03-06T01:22:00.png

点击 create token:
2020-03-06T01:06:17.png

增加如下内容:
2020-03-06T01:12:34.png

点击确认后,会显示 token,记录下来:
2020-03-06T01:15:22.png

在终端根据上面的 account ID 和 token 输入如下命令:

export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Account_ID="xxxxxxxxxxxxx"

然后开始生成证书,可以指定顶级域名和泛域名:

acme.sh --issue --dns dns_cf -d example.com -d *.example.com

CF_Tokenand CF_Account_ID will be saved in ~/.acme.sh/account.conf and will be reused when needed.

没有报错信息,代表生成成功,如果有报错,查看生成 api token 时候的权限设置有没有问题。

安装证书

默认生成的证书都放在安装目录下: /root/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

acme.sh --install-cert -d domain.you \
--key-file       /etc/nginx/domain.you/key.pem  \
--fullchain-file /etc/nginx/domain.you/cert.pem \
--reloadcmd     "service nginx force-reload"

以上命令安装证书后,会每 60 天自动更新证书,并自动运行 service nginx force-reload。我喜欢将证书放到 nginx/domain.you 目录下。

配置Nginx.conf

server {
    listen                443 ssl;
    listen                [::]:443 ssl;
    server_name           domain.you;
    keepalive_timeout     70;

    ssl_protocols         TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers           AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
    ssl_certificate       /etc/nginx/domain.you/cert.pem;
    ssl_certificate_key   /etc/nginx/domain.you/key.pem;
    ssl_session_cache     shared:SSL:10m;
    ssl_session_timeout   10m;
    ...
}

重启Nginx服务: service nginx force-reload

这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload

更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

更新acme.sh

升级 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

acme.sh  --upgrade  --auto-upgrade

之后, acme.sh 就会自动保持更新了.

你也可以随时关闭自动更新:

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

以上就是使用acme.sh生成免费证书的简单过程,安装完成后使用https登录你的网站看能否正常访问,如果不能试着重启系统。

配置完成后可以到 ssl labs 测试:https://www.ssllabs.com/ssltest/index.html
关于 Nginx 安全性更强的配置参考: https://niekun.net/archives/187.html

]]>
0 https://blog.niekun.net/archives/34.html#comments https://blog.niekun.net/feed/tag/acme-sh/archives/34.html