3个版本
0.1.2 | 2020年7月4日 |
---|---|
0.1.1 | 2020年7月4日 |
0.1.0 | 2020年7月3日 |
在 HTTP客户端 中排名第452
每月下载26次
23KB
175 行
HTTPS演示
演示如何在Rust中构建https网站。
为什么这个演示?
完成我的第一个https网站花费了大量的时间;因此,记录下这些学习经验!。
希望,它也能帮助其他人!。
学习经验
学会了使用
- 代码中的TLS。
- 来自Let's Encrypt的TLS证书。
- 在多个https Web服务器上使用nginx作为反向代理。
制作安全网站的步骤
步骤1:启用TLS支持
- 未加密的代码看起来像
let ip_addr = CONFIG.ip_address.as_ref().unwrap();
let socket_addr: SocketAddr = ip_addr.as_str().parse().unwrap();
warp::serve(routes)
.run(socket_addr)
.await;
- 添加了TLS代码。
let ip_addr = CONFIG.ip_address.as_ref().unwrap();
let cert_path = CONFIG.cert_path.as_ref().unwrap();
let key_path = CONFIG.key_path.as_ref().unwrap();
let socket_addr: SocketAddr = ip_addr.as_str().parse().unwrap();
warp::serve(routes)
.tls()
.cert_path(cert_path)
.key_path(key_path)
.run(socket_addr)
.await;
-
为了本地测试,使用了warp框架示例中找到的样本证书。
-
在开发机上运行服务器。
-
使用url: https://127.0.0.1:3010 在浏览器中测试。
-
确保它正在运行。
步骤2:在托管机上获取TLS证书
-
在托管机(以我的DigitalOcean为例),
a) 确保 certbot 已安装。
b) 确保80或443端口可用;这些端口未被其他程序(如Web服务器、nginx或apache)使用。
c) UFW(简单防火墙)已禁用($ sudo ufw disable
)。
d) 删除了用于将端口转发到一些http网站的iptables条目。 -
成功运行了以下命令。
$sudo certbot certonly --standalone -dexample.com
-
为多个域名再次尝试。
$sudo certbot certonly --standalone -dexample.com -dwww.example.com OR $ sudo certbot certonly --standalone -dexample.com,www.example.com
-
在获取证书后尝试添加更多域名。
$sudo certbot certonly --展开 -dexample.com,www.example.com,new1.example.com,new2.example.com
它显示了两个选项- 启动临时Web服务器(standalone)
- 将文件放在webroot目录中(webroot)
选择合适的数字[1-2]然后[enter](按'c'取消):1 <-- 选择选项1。
-
成功后,显示了“恭喜!”消息和证书存储的位置。
-
证书存储在
/etc/letsencrypt/live/example.com/
。 -
使用以下命令检查添加的证书。
$sudo certbot certificates
-
它显示了证书名称、域名、证书路径、私钥路径。
-
出于历史原因,包含证书的目录以0700权限创建,这意味着证书只能由以root用户运行的服务器访问。
-
使用以下命令修复问题:
$ sudo chmod 0755 /etc/letsencrypt/{live,archive}
。 -
还需要使用 chgrp 和 chmod 0640 来允许服务器读取
/etc/letsencrypt/live/$domain/privkey.pem
。请注意,实际的证书和私钥存储在存档文件夹中;实时文件夹只包含指向这些文件的链接。因此,在存档文件夹上应用了 chmod 和 chgrp 命令。
步骤3:通过试错尝试在不同场景中部署网站
场景1:在端口443上部署网站
- 在 Settings.toml 文件中进行了必要的配置更改。
- ipaddress 从 127.0.0.1:3010 更改为 0.0.0.0:443。
- 检查 ufw 状态以确保端口443被允许(使用
$ sudo ufw status
)。 - 确保证书路径和密钥路径指向 letsencrypt 文件夹。
- 在命令行上运行网站($ ./example)。
- 使用类似于 https://165.1.1.100 的 URL 在浏览器中检查;其中 165.1.1.100 是托管机的 IP 地址。
- 将
/etc/hosts
文件更新为 127.0.0.1 example.com 的条目。 - 使用 url https://example.com 检查浏览器。
场景2:在端口3010上部署网站
- 在 Settings.toml 文件中进行了必要的配置更改。
- ipaddress 从 127.0.0.1:3010 更改为 0.0.0.0:3010。
- 在 ufw 中添加了一个规则来允许端口3010(
$ sudo ufw allow 3010
)。 - 确保证书路径和密钥路径指向 letsencrypt 文件夹。
- 在命令行上运行网站($ ./example)。
- 要作为服务运行,请参考 https_demo.service 文件中的说明。
- 使用 url https://165.1.1.100:3010 检查浏览器。
- 更新或确保
/etc/hosts
文件包含 127.0.0.1 example.com 的条目。 - 使用 url https://example.com:3010 检查浏览器。
- 为了避免在 URL 中出现端口号,在 iptables 中添加了端口转发规则;命令如下
a)$ sudo sysctl net.ipv4.conf.ens3.forwarding=1
注意:网络接口 ens3 通过$ sudo ifconfig
识别。
b)$ sudo iptables -A PREROUTING -t nat -i ens3 -p tcp --dport 443 -j REDIRECT --to-ports 3010
c)$ sudo iptables -A FORWARD -t filter -p tcp -d 165.1.1.10 --dport 3010 -j ACCEPT
d) 使用
$sudo iptables -tnat -LPREROUTING -n -v --line-numbers
$sudo iptables -tfilter -LFORWARD -n -v --line-numbers
e) 如果出现错误,请在上方命令中记录行号,并在以下操作中使用它:
$ sudo iptables -t nat -D PREROUTING <line-number-here>
用于删除nat表中的一行
$ sudo iptables -t filter -D FORWARD <line-number-here>
用于删除filter表中的一行
注意:-A 表示添加,-t 表示表,-p 表示协议,-i 表示接口,-L 表示列出,-D 表示删除. - 使用url: https://example.com(注意:这次没有端口号)检查浏览器。
场景3:部署了多个网站
- 以上两个场景适用于单个网站。
- 要在同一台机器上运行多个网站,需要一个反向代理服务器(也称为网关)。
- 尽管有一个基于 Hyper 示例网关编写的 Rust 工具在 reverse-proxy 上,用于http,但它不能用于https。因此,使用了 nginx 服务器进行反向代理。
- 在托管机器上安装了 nginx 服务器。
- 测试了它是否工作。
- 参考了 nginx 配置步骤在 https-demo.eastgate.in 文件。了解到每个网站都需要一个单独的配置文件。
演示
演示在此处运行 here。
许可证
MIT
依赖项
~23–36MB
~688K SLoC