云服务器:CentOS 7.4
网站宿主:Apache
备案域名:xjp.slybaby.cn
控制面板:BT.cn
Let's Encrypt免费证书的签发/续签都是脚本自动化的,官方提供了几种证书的申请方式方法,点击此处 快速浏览。 我这里直接使用第三方客户端 acme.sh 申请,据了解这种方式可能是目前 Let's Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let's Encrypt 中的免费证书。 安装 acme.sh安装很简单,一条命令: - curl https://get.acme.sh | sh
复制代码
有可能会遇到 一个红色提示 忽略即可
[Thu Mar 14 17:51:03 CST 2019] Downloading https://github.com/Neilpang/acme.sh/archive/master.tar.gz
[Thu Mar 14 17:51:04 CST 2019] Extracting master.tar.gz
[Thu Mar 14 17:51:04 CST 2019] It is recommended to install socat first.
[Thu Mar 14 17:51:04 CST 2019] We use socat for standalone server if you use standalone mode.
[Thu Mar 14 17:51:04 CST 2019] If you don't use standalone mode, just ignore this warning.
整个安装过程进行了以下几步,了解一下即可: - 把 acme.sh 安装到当前用户的主目录$HOME下的.acme.sh文件夹中,即~/.acme.sh/,之后所有生成的证书也会放在这个目录下;
- (此条最新版本可能已经集成了先试试看)创建了一个指令别名alias acme.sh=~/.acme.sh/acme.sh,这样我们可以通过acme.sh命令方便快速地使用 acme.sh 脚本
- 安装结束后会自动添加一条定时任务(官方解释:自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。),使用crontab -l 查看。
- 安装命令执行完毕后,执行acme.sh --version确认是否能正常使用acme.sh命令。
参考
[root@bbr_ok /]# acme.sh --version
https://github.com/Neilpang/acme.sh
v2.8.1
如有版本信息输出则表示环境正常;如果提示命令未找到,执行source ~/.bashrc命令重载一下环境配置文件。 整个安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录~/.acme.sh/中。 生成证书据 acme.sh 官方文档介绍,其实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。 也就是我们有两种选择签发证书,这里我直接选择 http 验证方式,另外一种方式本篇不做介绍,可参考文档自行尝试。 签发证书也很简单,一条命令:
注:必须在 root 权限下运行上述命令哦,切记!切记!切记!如果域名都在阿里云,推荐使用 DNS 方式来验证
1、(一般常用)http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
申请一个域名
- acme.sh --issue -d xjp.slybaby.cn -w /www/wwwroot/xjp.slybaby.cn
复制代码
-d 申请多个域名
- acme.sh --issue -d xjp.slybaby.cn -d abc.slybaby.cn -d def.slybaby.cn -w /www/wwwroot/xjp.slybaby.cn
复制代码
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录: - acme.sh --issue -d mydomain.com --apache
复制代码
如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录: - acme.sh --issue -d mydomain.com --nginx
复制代码注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧.
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:
- acme.sh --issue -d mydomain.com --standalone
复制代码
简单解释下这条命令涉及的几个参数: - --issue是 acme.sh 脚本用来颁发证书的指令;
- -d是--domain的简称,其后面须填写已备案的域名;
- -w是--webroot的简称,其后面须填写网站的根目录。
2、dns 方式, 在域名上添加一条 txt 解析记录, 验证域名所有权.
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证.
- acme.sh --issue --dns -d mydomain.com
复制代码 然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
- acme.sh --renew -d mydomain.com
复制代码 注意第二次这里用的是 –renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
结果例
-----END CERTIFICATE-----
[Thu Mar 14 18:05:58 CST 2019] Your cert is in /www/server/panel/vhost/cert/xjp.slybaby.cn/xjp.slybaby.cn.cer
[Thu Mar 14 18:05:58 CST 2019] Your cert key is in /www/server/panel/vhost/cert/xjp.slybaby.cn/xjp.slybaby.cn.key
[Thu Mar 14 18:05:58 CST 2019] The intermediate CA cert is in /www/server/panel/vhost/cert/xjp.slybaby.cn/ca.cer
[Thu Mar 14 18:05:58 CST 2019] And the full chain certs is there: /www/server/panel/vhost/cert/xjp.slybaby.cn/fullchain.cer
[root@bbr_ok /]#
另外,可以通过下面两个常用acme.sh命令查看和删除证书:
# 查看证书列表
# 删除证书
- acme.sh remove <SAN_Domains>
复制代码
至此,证书就下载成功。
安装证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方. 注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的做法就是使用--installcert命令,指定目标位置,然后证书文件会被 copy 到相应的位置。 一条命令即可解决: - acme.sh --installcert -d xjp.slybaby.cn \
- --key-file /etc/nginx/ssl/xjp.slybaby.cn.key \
- --fullchain-file /etc/nginx/ssl/fullchain.cer \
- --reloadcmd "service nginx force-reload"
复制代码
(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)–installcert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效. 值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.如果是apache服务就换成相应的命令
安装复制例子
- acme.sh --installcert -d xjp.slybaby.cn --key-file /etc/v2ray/v2ray.key --fullchain-file /etc/v2ray/v2ray.cer
复制代码
这里我将证书放到了/etc/nginx/ssl/目录下。
最后一步就是,修改 Nginx 配置文件启用 ssl,修改完成后需要重启下 Nginx,这一块不再详述。Nginx 配置请参考:
NGINX安装证书
- ssl on;
- ssl_certificate /usr/local/nginx/conf/ssl/www.domain.cer;
- ssl_certificate_key /usr/local/nginx/conf/ssl/www.domain.key;
- ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- ssl_prefer_server_ciphers on;
- ssl_session_cache builtin:1000 shared:SSL:10m;
- ssl_session_timeout 1d;
- ssl_session_tickets on;
复制代码
注解
1_root_bundle.crt (证书链文件)
2_www.domain.com_cert.crt(证书文件)
3_www.domain.com.key(私钥文件)
完成证书部署后可以通过如下站点检测网站的安全级别:
更新证书自动更新目前 Let's Encrypt 的证书有效期是90天,时间到了会自动更新,您无需任何操作。 今后有可能会缩短这个时间, 不过都是自动的,不需要您关心。 但是,您也可以强制续签证书: - acme.sh --renew -d example.com --force
复制代码
更新 acme.sh目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。 升级 acme.sh 到最新版: 如果您不想手动升级,,可以开启自动升级: - acme.sh --upgrade --auto-upgrade
复制代码您也可以随时关闭自动更新: - acme.sh --upgrade --auto-upgrade 0
复制代码
高级内容
宝塔面板不能续签的解决办法看这个帖子
https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=16687
面板ssh无法打开
- pip install flask-socketio==3.0.2
- pip install python-socketio==2.1.2
- bt reload
复制代码
|