引言

  • HTTPS证书,通常是指SSL/TLS证书,它的基本功能是为网站提供加密通信的能力,确保数据在客户端和服务器之间传输时的安全性。这种证书通过使用公钥和私钥的非对称加密方式,以及随后的对称加密,来保护数据不被窃听或篡改。此外,HTTPS证书还用于验证网站的身份,防止用户误访问假冒网站,从而维护网络安全和用户信任

  • 在网络安全领域,HTTPS证书的管理历来是一个技术挑战,尤其是对于那些需要维护多个网站或服务的组织而言。从证书的申请、验证、安装到后续的续订,每一个环节都可能成为安全与效率的绊脚石。然而,今天给大家介绍的这个tls-shunt-proxy,这一切迎来了革命性的变化。

背景知识:

Let's Encrypt是一个提供免费SSL/TLS证书的证书颁发机构(CA),它由互联网安全研究集团(Internet Security Research Group, ISRG)运营。Let's Encrypt的成立旨在促进全球网站采用HTTPS,以增加网络通信的安全性和用户隐私保护。它通过自动化的方式简化了证书的申请和续期过程,大大降低了部署HTTPS的技术门槛和成本。

Let's Encrypt的核心贡献在于它推动了自动证书管理环境(Automated Certificate Management Environment, ACME)协议的发展,这是一个开放标准,允许服务器自动与CA交互,以获取、续期和吊销证书。ACME协议的设计原则之一是避免手动干预,这样可以减少人为错误,提高安全性,同时保持低成本运营,使得免费证书能够广泛应用于互联网。

Let's Encrypt自推出以来,已经成为世界上最大的证书颁发机构之一,为数百万个域名提供了证书,对提升整个互联网的安全水平起到了关键作用。它的服务不仅加速了HTTPS的普及,还有助于构建更加信任和安全的在线环境,作为一个非盈利的CA,通过提供免费、自动化的证书管理服务,对提升网络安全和推动HTTPS的广泛采用发挥了不可或缺的作用

自动化HTTPS证书的获取机制

自动化HTTPS证书获取机制是指利用自动化证书管理环境(ACME)协议,由客户端软件自动与证书颁发机构(CA)交互,以获取、续期和吊销数字证书的过程。这一机制显著简化了传统的手动证书管理流程,提高了安全性和效率。

ACME协议的工作原理

ACME协议定义了一系列API接口,允许客户端软件自动执行与CA的通信。客户端软件按照以下步骤操作:

  1. 注册账户:客户端软件首次与CA交互时,需要注册一个账户。

  2. 发起证书申请:客户端生成密钥对,并创建证书签名请求(CSR),然后通过ACME协议向CA提交CSR。

  3. 域名验证:CA通过HTTP-01或DNS-01挑战来验证客户端对指定域名的控制。HTTP-01挑战涉及在域名指向的服务器上放置特定文件,而DNS-01挑战则涉及在域名的DNS记录中设置特定的TXT记录。

  4. 证书颁发:一旦验证成功,CA会颁发SSL/TLS证书,并将证书发送回客户端。

  5. 安装证书:客户端接收证书后,将其安装在服务器上,启用HTTPS服务。

实际应用中的自动化工具

流行的自动化工具包括Certbot、acme.sh和cert-manager等。这些工具实现了ACME协议,并与Let's Encrypt等CA合作,提供了易于使用的界面和脚本,帮助用户自动化证书的申请和管理过程

通过自动化HTTPS证书的获取机制,组织可以更容易地遵守网络安全最佳实践,同时确保其在线服务的安全性和可信度。

安装与配置

  • 项目介绍分流 TLS 流量,支持按 sni 分流,分流 http 和无特征流量

  • 快速上手:提按照 Github 使用教程,安装很简单bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh)

  • 命令行参数

      -config string
            Path to config file (default "./config.yaml")
  • 配置示例

    # listen: 监听地址
    listen: 0.0.0.0:443
    
    # redirecthttps: 监听一个地址,发送到这个地址的 http 请求将被重定向到 https
    redirecthttps: 0.0.0.0:80
    
    # inboundbuffersize: 入站缓冲区大小,单位 KB, 默认值 4
    # 相同吞吐量和连接数情况下,缓冲区越大,消耗的内存越大,消耗 CPU 时间越少。在网络吞吐量较低时,缓存过大可能增加延迟。
    inboundbuffersize: 4
    
    # outboundbuffersize: 出站缓冲区大小,单位 KB, 默认值 32
    outboundbuffersize: 32
    
    # vhosts: 按照按照 tls sni 扩展划分为多个虚拟 host
    vhosts:
    
        # name 对应 tls sni 扩展的 server name
      - name: vmess.example.com
    
        # tlsoffloading: 解开 tls,true 为解开,解开后可以识别 http 流量,适用于 vmess over tls 和 http over tls (https) 分流等
        tlsoffloading: true
    
        # managedcert: 管理证书,开启后将自动从 LetsEncrypt 获取证书,根据 LetsEncrypt 的要求,必须监听 443 端口才能签发
        # 开启时 cert 和 key 设置的证书无效,关闭时将使用 cert 和 key 设置的证书
        managedcert: false
    
        # keytype: 启用 managedcert 时,生成的密钥对类型,支持的选项 ed25519、p256、p384、rsa2048、rsa4096、rsa8192
        keytype: p256
    
        # cert: tls 证书路径,
        cert: /etc/ssl/vmess.example.com.pem
    
        # key: tls 私钥路径
        key: /etc/ssl/vmess.example.com.key
    
        # alpn: ALPN, 多个 next protocol 之间用 "," 分隔
        alpn: h2,http/1.1
    
        # protocols: 指定 tls 协议版本,格式为 min,max , 可用值 tls12(默认最小), tls13(默认最大)
        # 如果最小值和最大值相同,那么你只需要写一次
        # tls12 仅支持 FS 且 AEAD 的加密套件
        protocols: tls12,tls13
    
        # http: 识别出的 http 流量的处理方式
        http:
    
          # paths: 按 http 请求的 path 分流,从上到下匹配,找不到匹配项则使用 http 的 handler
          paths:
    
              # path: path 以该字符串开头的请求将应用此 handler
            - path: /vmess/ws/
              handler: proxyPass
              args: 127.0.0.1:40000
    
              # path: http/2 请求的 path 将被识别为 *
            - path: "*"
              handler: proxyPass
              args: 127.0.0.1:40003
    
            - path: /static/
    
              # trimprefix: 修剪前缀,将 http 流量交给 handler 时,修剪 path 中的前缀
              # 如将 /static/logo.jpg 修剪为 /logo.jpg
              trimprefix: /static
    
              handler: fileServer
              args: /var/www/static
    
          # handler: fileServer 将服务一个静态网站
          # fileServer 支持 h2c, 如果使用 fileServer 处理 http, 且未设置 paths, alpn 可以开启 h2
          handler: fileServer
    
          # args: 静态网站的文件路径
          args: /var/www/html
    
        # http/2 请求的处理方式,当此项设置后,http 中的 path: "*" 设置将无效
        http2:
          - path: /
            handler: fileServer
            args: /var/www/rayfantasy
          - path: /vmess
            handler: proxyPass
            # 目前只支持目标接受 h2c
            args: h2c://localhost:40002
    
        # trojan: Trojan 协议流量处理方式
        trojan:
          handler: proxyPass
          args: 127.0.0.1:4430
    
        # default: 其他流量处理方式
        default:
    
          # handler: proxyPass 将流量转发至另一个地址
          handler: proxyPass
    
          # args: 转发的目标地址
          args: 127.0.0.1:40001
    
          # args: 支持通过 Proxy Protocol 将源地址向后端传抵,目前仅支持 v1
          # args: 127.0.0.1:40001;proxyProtocol
    
          # args: 也可以使用 domain socket
          # args: unix:/path/to/ds/file
    
      - name: trojan.example.com
    
        # tlsoffloading: 解开 tls,false 为不解开,直接处理 tls 流量,适用于 trojan-gfw 等
        tlsoffloading: false
    
        # default: 关闭 tlsoffloading 时,目前没有识别方法,均按其他流量处理
        default:
          handler: proxyPass
          args: 127.0.0.1:8443

使用场景

  • 针对域名自动进行 https 续期

上面是我的 config.yaml 配置。之前在阿里云服务器上,每三个月就要续费一次证书。虽然不困难,但是还是很麻烦。有了这个工具,证书差不多算是用不到期了。

而且支持 vhosts 配置,可以将多个域名都配置上,同一个服务器的 443 端口可以转发多个域名的 https 流量。

当然还有最主要的流量识别:当识别到流量是 http/https 的时候,可以转发到一个地址,当识别到是 trojan协议或者其他协议的时候,可以设置对应的处理规则。要实现“霍格沃茨”,这个有很大用处!

总下下优势

  • 效率与易用性提升:自动化特性让证书管理不再占用宝贵的IT资源,即使是技术背景较弱的用户也能轻松驾驭。

  • 安全性的增强:自动续订和撤销机制确保了证书的有效性和安全性,降低了因证书过期或被滥用的风险。

  • 成本节约:通过简化流程,减少人力资源的投入,从而在长远中节省了维护成本。

这里是工具的链接 https://github.com/liberal-boy/tls-shunt-proxy.