升级博客到HTTPS
最近一直在搞flutter,遇见了使用flutter_webview_plugin
支持webview的需求,打算把博客链接放上去,后来发现配置的网页URL必须是https
的才行,由于之前站点一直没有升级https,因此需要首先解决这个问题。
下面是为站点申请免费的https证书的流程整理,实际操作之后,对于https的原理有了更清楚的认识。
之前整理了HTTPS原理,本文主要讲解如何申请免费的HTTPS证书,以及部署在服务器上面。
Let’s Encrypt免费证书
参考:
大致流程
- 通过Let’s Encrypt 申请免费证书
- 然后下载到服务器磁盘上,最后在
nginx
配置好证书路径就可以了
具体步骤
先安装脚本
git clone https://github.com/certbot/certbot
cd certbot
chmod +x certbot-auto
# certbot-auto 即为自动化脚本工具, 他会判断你的服务是nginx还是apache, 然后执行对应逻辑
./certbot-auto --help
然后执行自动命令
./certbot-auto certonly --webroot --agree-tos -v -t --email [email protected] -w /usr/share/nginx/html -d www.shymean.com
其中的参数含义
- --email对应邮箱,会往该邮箱发送验证链接,貌似没啥用
- -w 站点根目录,后续脚本会在该目录创建验证文件,并进行http访问
- -d 需要加密的域名
正常成功的情况下,脚本完成后会提示
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/www.shymean.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/www.shymean.com/privkey.pem
Your cert will expire on 2019-04-03. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
可以看见对应的密钥文件路径,注意私钥不要泄露出去
- 服务器公钥
/etc/letsencrypt/live/www.shymean.com/fullchain.pem
- 服务器私钥
/etc/letsencrypt/live/www.shymean.com/privkey.pem
最后配置一下nginx
,开始443端口,和ssl证书路径即可
server {
listen 443;
server_name www.shymean.com
ssl on;
ssl_certificate /etc/letsencrypt/live/www.shymean.com/fullchain.pem
ssl_certificate_key /etc/letsencrypt/live/www.shymean.com/privkey.pem
}
配置修改保存后,执行sudo nginx -s reload
重启服务器,最后重新使用chrome访问博客链接https://shymean.com,就可以看见地址栏的小锁安全标识了。
遇见的问题
环境报错
运行脚本时提示错误:OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 1
这个看起来是编码的问题,参考issue,解决方案
sudo apt-get install letsencrypt
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
验证失败
在创建证书的时候,需要对域名进行校验,大致过程就是在服务器某个目录放一个文件,保证Let’s Encrypt
可以访问到,能访问到就说明你是有这个服务器权限的,因此才会给你生成证书。
期间遇见了如下错误
The following errors were reported by the server: Domain: shymean.com Type: unauthorized Detail: Invalid response from
http://shymean.com/.well-known/acme-challenge/WLMrgPQzIxK6OWn6yyIpUM_eEYNKI6ZtUL7OBb9LyTs
[45.77.153.232]: 500
原因是我的后台使用koa实现的自定义路由,文件系统访问需要单独访问静态资源目录。
如果不想修改网站代码的话,可以先将nginx对应域名代理到一个纯静态的目录下面,将校验文件放在合适的目录.well-known/acme-challenge
,之后再重新生成。这个操作端时间内会影响域名的正常访问。
生成失败超过限制
上述错误导致重试了很多次,域名生成频繁导致进入风控。将域名从shymean.com替换成www.shymean.com解决。参考 rate-limits。
证书三个月后失效
免费证书的时效性一般都比较短,需要手动生成证书,参考:如何为Let’s Encrypt颁发的SSL证书续期
通过脚本生成的renew
命令
cd ~/certbot
# 在某些时候提示 Couldn't download xxx,这是因为自动升级下载的依赖包时报了,可以添加--no-self-upgrade后缀
./letsencrypt-auto renew --email [email protected] --agree-tos --no-self-upgrade
注意,在续期的时候,同样需要重新使用校验文件验证域名。
云服务商的免费证书
NOTE
本章节为2023年后续更新
参考
我的域名实在阿里云万网上面购买的,自2021年01月01日起,每个阿里云个人或企业用户(以实名认证为准)每年可以一次性申请20张免费Digicert DV单域名试用证书(就是免费证书)。
因此,如果不想要像上面这样通过脚本手动生成证书,也可以直接用云服务商提供的免费证书,操作也比较简单
大致流程为
- 前往控制台申请证书
- 证书生成后,下载对应格式的文件,手动上传到服务器
- 修改nginx证书路径,重启服务器
七牛等CDN厂商也提供了一键式的免费SSL证书,只需要简单申请一下即可,具体可以查阅对应服务商相关文档。
同样,免费的证书都有有效期限制,一般来说是1年,到期后需要手动更换。服务商一般会在证书过期前一个月通过邮箱进行通知
托管服务器
类似于cloudflare
等服务商可以托管静态站点,同时直接提供了免费ssl证书,我们就不需要单独申请和配置证书了。
本博客现在的HTTPS就采用了这种方式。
小结
之前知道https的大致原理,却一直没有动手去把站点升级到https,主要的原因就是觉得目前博客不涉及私密信息,没有升级https的必要性。此外由于服务器本身性能较差,访问也比较少,因此就此耽搁了。
但是从动手升级后重新了解到https的原理这件事可以看见,很多东西,还是需要多动手去尝试才行,纸上谈兵是大忌~
你要请我喝一杯奶茶?
版权声明:自由转载-非商用-保持署名和原文链接。
本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。