之前搭建了一个 codeserver 的开发环境,但还遗留了配置HTTPS访问域名的问题。本周正好有空搞下,本来打算花钱买一个HTTPS证书,发现 Let’s Encrypt 提供了免费的HTTPS证书,而且还提供了配套的工具让网站开启HTTPS变得非常简单,本文记录下安装步骤。
在介绍安装步骤之前先简单介绍一下 HTTPS 的工作原理,不感兴趣的同学可以直接跳过。
简单来说,HTTPS 就是安全的HTTP(S表示Secure的意思),我们知道HTTP报文是采用明文传输的,报文容易被窃听或篡改。HTTPS 是在传输层和应用层中加一个安全层(SSL),负责对报文进行加密和解密。
传统的对称加密(加密解密使用相同密钥)要在传输两端共享密钥,涉及到密钥安全问题。而非对称加密(公钥加密,私钥解密)可以完美解决密钥交换问题。非对称加密的公钥是公开的,任何人都可以使用这个公钥进行加密。
但别人又怎么相信这个公钥是你发布的呢,这又是一个信任问题,解决办法是引入一个可信息的第三方机构。通常的做法是将这个公钥放到一个证书(Certificate)中,然后由这个可信任的第三方机构来统一认证和颁发。这个可信任的第三方机构就是证书颁发机构(CA,Certificate Authority)。
拿到证书后,怎么验证这个证书是不是第三方机构颁发的呢?(哈哈,是不是感觉问题好多呀),答案是使用数字签名技术,简单来说就是为证书的内容做一个签名,并附到证书的末尾,这个签名具有惟一性和不可伪造性。
客户端(通常是浏览器)收到证书时会对证书合法性进行检查。如果这个机构是可信任的权威机构颁发的,浏览器可能已经知道其公开密钥了(浏览器会预先安装很多签名颁发机构的证书),这样,就可以通过数字签名来验证证书的完整性了。
所以,客户端和服务端进行HTTPS通信时,除了进行正常的TCP三次握手外,还需要进行SSL握手,这个过程主要是从服务端拿到证书、验证证书的合法性,然后交换加密密钥。后续的通信就可以使用这个加密密钥对报文加密和解密了。
突然发现写多了(化繁为简能力还有提高),以上就是HTTPS的大致原理,当然HTTPS的细节交互更加复杂,以上概述只是让大家对HTTPS有个宏观上的认识。有了这个背景,我们就知道启用HTTPS主要需要以下两个步骤:
- 从CA机构获取一个受信任的HTTPS证书。
- 将证书部署到服务端。
Let’s Encrypt 就是一个可信息的证书颁发机构,它颁发的免费数字证书浏览器是信任的,而且它还提供便捷的安装和续约工具,下面就进入安装环节吧。
系统环境
各个系统环境有所差异,以下我使用的系统环境为例:
- CentOS 8
- Nginx 1.20
- 需要sudo权限
安装步骤
- 打开 certbot.eff.org
- 选择 操作系统 和 Web Server,我使用的是CentOS 8 + Nginx
- 安装 snapd
- 升级 snapd 到最新版本
1 | sudo snap install core |
- 安装 certbot
1 | sudo snap install --classic certbot |
- 让 certbot 命令可用
1 | sudo ln -s /snap/bin/certbot /usr/bin/certbot |
- 安装数字证书
1 | sudo certbot --nginx |
- 自动续约数字证书
1 | sudo crontab -e |
每天3:15定时检查并自动续约数字证书
- 重新加载nginx配置
1 | sudo service nginx reload |
- 测试https是否生效
使用浏览器打开你的网站 https://yourwebsite.com/,看看https是否已经生效呢。如果https已生效,将会在浏览器地址栏看到一把代表https的小锁,点开后可以看到证书的相关信息。
踩坑记录
我安装完后并没有生效,原因是我使用了云托管主机,安全规则入方向并没有打开443端口(HTTPS默认使用443,可以在nginx.conf文件中看到配置),修改下安全规则即可。
参考资料
[1] letsencrypt.org
[2] certbot.eff.org