侧边栏

升级博客到HTTPS

发布于 | 分类于 博客

最近一直在搞flutter,遇见了使用flutter_webview_plugin支持webview的需求,打算把博客链接放上去,后来发现配置的网页URL必须是https的才行,由于之前站点一直没有升级https,因此需要首先解决这个问题。

下面是为站点申请免费的https证书的流程整理,实际操作之后,对于https的原理有了更清楚的认识。

之前整理了HTTPS原理,本文主要讲解如何申请免费的HTTPS证书,以及部署在服务器上面。

Let’s Encrypt免费证书

参考:

大致流程

  • 通过Let’s Encrypt 申请免费证书
  • 然后下载到服务器磁盘上,最后在nginx配置好证书路径就可以了

具体步骤

先安装脚本

bash
git clone https://github.com/certbot/certbot
cd certbot
chmod +x certbot-auto

# certbot-auto 即为自动化脚本工具, 他会判断你的服务是nginx还是apache, 然后执行对应逻辑
./certbot-auto --help

然后执行自动命令

bash
./certbot-auto certonly --webroot --agree-tos -v -t --email [email protected] -w /usr/share/nginx/html -d www.shymean.com

其中的参数含义

  • --email对应邮箱,会往该邮箱发送验证链接,貌似没啥用
  • -w 站点根目录,后续脚本会在该目录创建验证文件,并进行http访问
  • -d 需要加密的域名

正常成功的情况下,脚本完成后会提示

bash
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证书路径即可

nginx
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,解决方案

bash
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命令

bash
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的原理这件事可以看见,很多东西,还是需要多动手去尝试才行,纸上谈兵是大忌~

你要请我喝一杯奶茶?

版权声明:自由转载-非商用-保持署名和原文链接。

本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。