Marco Nie - acme.sh https://blog.niekun.net/tag/acme-sh/ 使用acme.sh生成 ssl 证书并部署到 Nginx https://blog.niekun.net/archives/34.html 2019-02-19T09:02:00+08:00 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:点击 create token:增加如下内容:点击确认后,会显示 token,记录下来:在终端根据上面的 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.confserver { 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