acme
协议, 可以从 letsencrypt 生成免费的证书.官方说明:https://github.com/Neilpang/acme.sh
安装很简单:
apt-get install curl
curl https://get.acme.sh | sh
安装过程进行了以下几步:
/root/.acme.sh/
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 验证可以生成泛域名的证书,更加方便的适用于二级域名。
需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
acme.sh --issue -d domain.you -d www.domain.you -d abc.domain.you --webroot /your/www/root
只需要指定域名, 可以同时生成多个域名到一个证书,并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
可以使用域名解析服务商的 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 目录下。
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 --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