视频版:
三行命令,免费申请https加密证书,一次配置,永久生效。NAS/家庭内网服务配置TLS加密,自建网站配置SSL/TLS加密
只需3行命令,免费申请配置https加密证书,一次配置,永久生效。对于家庭NAS服务,或者自建网站等暴露在公网上的网络应用,如果只使用http协议,信息是明文传输的。只要攻击者在通信链路中的任意一个路由器抓个包,就可以看到包里的全部内容,因此很不安全。使用https协议,或者说配置TLS加密,则可以保护传输的安全。
这其中最关键的步骤,就是从CA机构那里申请服务器证书。CA机构作为受信任的第三方,是确保客户端与服务端之间互相信任的核心机制。
现在网上,有很多免费提供TLS证书的服务商,比如Let's Encrypt,不过这里的免费证书只有短短的90天。频繁续签更换证书,绝对是一个令人头秃的麻烦事情。
本期视频,我们使用Github上面一个3.9万star的开源项目acme.sh。它只需要几行简单的命令,就可以免费申请到TLS证书,还能全自动续签,一劳永逸解决https证书的难题。本期视频,我打算用两个例子来演示配置TLS加密:一个是部署在云服务器上面的自建网站,还有一个是家庭的内网服务。
云服务器自建网站
Ngnix 搭建网站
这是我的一台云服务器,我们先来搭建一个简单的网站。我这是Ubuntu系统的,我先安装一下nginx:
sudo apt update
接下来我安装nginx:
sudo apt install nginx
我把nginx启动一下:
sudo service nginx start
好,我们来访问一下。这里我直接在浏览器输入服务器的公网地址,协议是http,因为现在我们还没有配置TLS加密。这里出现一个nginx的欢迎页面,那我们的nginx就配置成功了,网站也就搭建好了。
域名配置
这里我准备了一个tech-shrimp.com的域名。爬爬虾之前视频里有介绍过如何低价获得一个域名或者申请免费的域名,这里我就不赘述了。我们拿到域名以后,在域名脱管网站添加一个DNS记录,把域名解析到我刚才的服务器上面。我把这个小黄云先关上,这里添加一个a类型的记录,名称填写@,IPV4地址填写我服务器的公网IP地址,然后点击保存。
这个域名就解析到了我的服务器上,然后我通过域名就可以访问到服务器了。这里我输入域名,这里显示一个不安全,它没有证书。
HTTPS证书配置步骤
我们进入项目首页,
GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol
这里有中文说明,我们按照这个提示把它安装一下。
我们先来第一条命令,然后回车。
curl https://get.acme.sh | sh -s email=my@example.com
这个安装需要依赖Github的网络,如果下载不下来的话,我们可以换成这3个命令,一样可以完成安装。
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
显示install success就安装成功了。
这里需要记一下安装地址,我的机器就放到了root目录下面。
我们来看一下nginx的配置,这里进入这个目录/etc/nginx/sites_available。我们看一下这个default文件,这里nginx监听了80端口,然后这里的root也就是网页的根目录放到了这个文件夹下面。
我们把这个地址复制一下,等下要用。
接下来使用命令申请证书
/root/.acme.sh/acme.sh --issue -d tech-shrimp.com -webroot /var/www/html
首先,这个-d这里要替换成自己的域名。这里我的域名是tech-shrimp.com。开头的acme.sh需要修改成完整路径。最后的webroot需要改一下,改成我们刚才查看的那个nginx配置。
这里要注意点,我们在命令里使用的域名必须先在cloudflare里有对应的DNS配置。
证书安装
我准备在服务器上面新建一个文件夹(/etc/nginx/tls/)用来存放证书跟私钥。:
mkdir /etc/nginx/tls
接下来配置安装证书的命令,把脚本的地址写全,把域名改成自己的,--key-file --fullchain-file 是我们在nginx上面存放私钥还有服务器证书的地址。
最后reloadcmd指的是配置完成证书以后重启nginx所需的命令,这里普通的reload不行,我们必须改成force-reload
/root/.acme.sh/acme.sh --install-cert -d tech-shrimp.com \
--key-file /etc/nginx/tls/key.pem
--fullchain-file /etc/nginx/tls/cert.pem
--reloadcmd "service nginx force-reload"
敲入命令以后,显示success。我们进对应的目录看一下(/etc/nginx/tls),看到私钥跟证书都放到这个路径下面了。
Nginx配置修改
然后我们只需要进行最后一步,把这个私钥跟证书添加到nginx配置里面,并且把443端口暴露出来。
我们还是进入这个目录/etc/nginx/sites-available,进来以后主要修改这个default文件。启起来。
vi /etc/nginx/sites-available/default
我添加一行443端口的配置。这里指的是把443端口也开启起来,使用http2协议,并且开启了SSL/TLS的加密。证书文件已经安装到nginx目录下面了,我们只需要把证书文件引用过来,添加两行:第一行指向的是证书的位置,第二行指向的是服务器的私钥地址。
server {
listen 80 default_server;
listen 443 ssl http2;
listen [::]:80 default_server;
ssl_certificate /etc/nginx/tls/cert.pem;
ssl_certificate_key /etc/nginx/tls/key.pem;
}
好,全部配置完成以后,我们点击ESC,然后:wq!(回车)。
验证
接下来我再重启一下nginx
service ngnix force-reload
重启完成以后,我们访问一下我的域名tech-shrimp.com,这里可以使用https协议了,然后我们回车。可以看到现在就是一个安全的网站,
回到服务器执行这个命令:
crontab -e
发现有一个定时脚本,它会每天帮我们检查证书,如果发现证书快要到期了,就会帮助我们自动续签。也就是说,TLS证书这个事情,我们以后就不用操心了,acme.sh会为我们自动续签证书。
家庭内网服务配置HTTPS
这是我经常用的一个订阅微信公众号为RSS链接的项目,然后它有一个内网地址,然后使用的是4,000端口。我在路由器这里配置了端口转发,也就是说,把我内网的地址代理到公网上,同样的使用4,000端口。
DDNS配置
接下来我配置ddns go,这样就可以使用域名访问到内网服务。这些配置的技术原理还有具体介绍,爬爬虾的往期视频里面都有详细的介绍。如果对这块不熟悉的观众,可以找来看一下。这里我讲的比较快。
我们先把ddns go配好。进入我域名托管的Cloudflare网站,找到我的个人资料,API令牌-->创建令牌->编辑区域DNS--->使用模板,点击继续以显示摘要,创建令牌。
我们把这个令牌复制下来,填写到DDNS go的这个TOKEN这里。
接下来把IPV4启用,然后我们填写一个域名,这个域名就可以直接指向我的家庭内网服务。这里域名叫home.tech-shrimp.com,然后我们保存一下。
访问测试与证书配置
我把我的电脑切换成手机热点,这样就可以模拟互联网的外网访问。因为家庭网络里80跟443端口是默认禁止的,所以后面端口还是要接的4,000端口,然后我们回车。
好这里显示出WeWe RSS,也就是说,我使用域名可以访问到我家庭的内网服务了。不过这里还是一个不安全,没有配置证书。
安装acme.sh
接下来我马上演示使用ACME配置证书。接下来进入我内网的一个家庭服务器,我们执行这几个命令:
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
还是把邮箱改成我自己的,回车。
DNS验证配置
接下来我们来生成证书。由于我家庭内网服务里面没有80端口,所以http验证的方式肯定是不行的。我们需要改成DNS验证,然后使用这个自动验证。
进来以后第一个就是Cloudflare,我们需要先配置两个环境变量。第一个是这个Cloudflare TOKEN,
接下来我们需要第二个环境变量,这个名字叫做CF_Zone_ID。
我们去Cloudflare官网去找这个区域ID,这里回到首页,找到我需要的那个域名tech-shrimp.com。右下角有一个API的区域ID,我把这个ID填写过来。
使用命令将两个环境变量配置好,一个是CF_Token,一个是CF_Zone_ID。
Nginx配置与反向代理
接下来我们用这个命令来配置证书。注意以下几点:
- 首先是这个脚本的路径
- 接下来是DNS类型,这里DNS是dns_cf,对应cloudflare
- 后面是我的域名,这里是home.tech-shrimp.com
/home/tech-shrimp/.acme.sh/acme.sh --issue --dns dns_cf -d home.tech-shrimp.com
我们需要把证书安装到nginx里面。我先把nginx安装一下,现在我要做的是把证书导入到nginx里面,然后使用nginx做一个反向代理,把我家庭的服务代理出来。
/root/.acme.sh/acme.sh --install-cert -d tech-shrimp.com \
--key-file /etc/nginx/tls/key.pem
--fullchain-file /etc/nginx/tls/cert.pem
--reloadcmd "service nginx force-reload"
反向代理
最后一步我们还是配置nginx,这里我需要一个反向代理,把我家庭内网的服务通过nginx代理到公网上。这里还是进入/etc/nginx/sites_available,我们来修改一下这个配置文件。这里我们添上https的端口,不过端口不能使用443端口了,家庭宽带没有443端口,这里我使用的是5,000端口。
接下来把服务器私钥跟证书配置上,这个还是跟之前一样的。最下面,这里我们需要做一个反向代理,这里的proxy pass填写内网的IP加端口。好我们保存一下,然后重启一下nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 5000 ssl http2;
ssl_certificate /etc/nginx/tls/cert.pem;
ssl_certificate_key /etc/nginx/tls/key.pem;
location / {
proxy_pass http://192.168.31.76:4000/;
}
}
服务器配置成功以后,我们别忘了在路由器添加一条端口转发,把内网服务器的5,000端口映射到公网上面。
测试
接下来我们来测试一下。通过连接我手机的热点,把我电脑切换到公网上,然后我们在浏览器输入我们的域名,后面端口就改成5,000端口,然后协议的话是https。我们可以看到成功的进行了访问。
这里观众朋友们可能有一个误区,就是https跟443端口不是强绑定的关系。我们使用443端口只是可以省略不写端口,但是用任意一个端口都可以达成https协议的访问。包括我们看到这里的连接是安全的,证书也是有效的,浏览器这里也没有报任何的不安全提示。所以使用443以外的端口,一样可以达成https的访问,效果并没有什么不同。