#reverse-proxy #https #warp #secured

app https_demo

Rust中的https演示网站

3个版本

0.1.2 2020年7月4日
0.1.1 2020年7月4日
0.1.0 2020年7月3日

HTTP客户端 中排名第452

每月下载26

MIT许可

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
    它显示了两个选项

    1. 启动临时Web服务器(standalone)
    2. 将文件放在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}

  • 还需要使用 chgrpchmod 0640 来允许服务器读取 /etc/letsencrypt/live/$domain/privkey.pem。请注意,实际的证书和私钥存储在存档文件夹中;实时文件夹只包含指向这些文件的链接。因此,在存档文件夹上应用了 chmodchgrp 命令。

步骤3:通过试错尝试在不同场景中部署网站

场景1:在端口443上部署网站

  • Settings.toml 文件中进行了必要的配置更改。
    1. ipaddress 从 127.0.0.1:3010 更改为 0.0.0.0:443
    2. 检查 ufw 状态以确保端口443被允许(使用 $ sudo ufw status)。
    3. 确保证书路径和密钥路径指向 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 文件中进行了必要的配置更改。
    1. ipaddress 从 127.0.0.1:3010 更改为 0.0.0.0:3010。
    2. 在 ufw 中添加了一个规则来允许端口3010($ sudo ufw allow 3010)。
    3. 确保证书路径和密钥路径指向 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