Skip to content

Instantly share code, notes, and snippets.

@hightemp
Last active August 6, 2024 07:58
Show Gist options
  • Save hightemp/e15e1341558d11e4bc45bfc4fb273b39 to your computer and use it in GitHub Desktop.
Save hightemp/e15e1341558d11e4bc45bfc4fb273b39 to your computer and use it in GitHub Desktop.

Revisions

  1. hightemp revised this gist Aug 6, 2024. 2 changed files with 3 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions generate_keys.sh
    Original file line number Diff line number Diff line change
    @@ -1,2 +0,0 @@
    #!/bin/bash
    openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
    3 changes: 3 additions & 0 deletions https_socket_proxy.go
    Original file line number Diff line number Diff line change
    @@ -10,6 +10,9 @@ import (
    "strings"
    )

    // generate keys
    // openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes

    func main() {
    // Загрузка сертификата и ключа
    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
  2. hightemp renamed this gist Aug 6, 2024. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. hightemp revised this gist Aug 6, 2024. No changes.
  4. hightemp created this gist Aug 6, 2024.
    2 changes: 2 additions & 0 deletions generate_keys.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,2 @@
    #!/bin/bash
    openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
    99 changes: 99 additions & 0 deletions http_socket_proxy.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,99 @@
    package main

    import (
    "bufio"
    "crypto/tls"
    "fmt"
    "io"
    "log"
    "net"
    "strings"
    )

    func main() {
    // Загрузка сертификата и ключа
    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
    if err != nil {
    log.Fatal("Failed to load certificate:", err)
    }

    // Конфигурация TLS
    config := &tls.Config{
    Certificates: []tls.Certificate{cert},
    }

    // Запуск HTTPS сервера
    listener, err := tls.Listen("tcp", ":8443", config)
    if err != nil {
    log.Fatal("Failed to start HTTPS server:", err)
    }
    defer listener.Close()

    fmt.Println("HTTPS Proxy server listening on :8443")

    for {
    conn, err := listener.Accept()
    if err != nil {
    log.Println("Failed to accept connection:", err)
    continue
    }
    go handleConnection(conn)
    }
    }

    func handleConnection(clientConn net.Conn) {
    defer clientConn.Close()

    reader := bufio.NewReader(clientConn)
    requestLine, err := reader.ReadString('\n')
    if err != nil {
    log.Println("Error reading request:", err)
    return
    }

    parts := strings.Split(strings.TrimSpace(requestLine), " ")
    if len(parts) != 3 {
    log.Println("Invalid request line:", requestLine)
    return
    }

    method, host, version := parts[0], parts[1], parts[2]

    if method == "CONNECT" {
    handleHTTPS(clientConn, host)
    } else {
    handleHTTP(clientConn, method, host, version, reader)
    }
    }

    func handleHTTP(clientConn net.Conn, method, host, version string, reader *bufio.Reader) {
    if !strings.HasPrefix(host, "http://") {
    host = "http://" + host
    }

    targetConn, err := net.Dial("tcp", host[7:])
    if err != nil {
    log.Println("Failed to connect to target:", err)
    return
    }
    defer targetConn.Close()

    fmt.Fprintf(targetConn, "%s %s %s\r\n", method, host, version)
    go io.Copy(targetConn, reader)
    io.Copy(clientConn, targetConn)
    }

    func handleHTTPS(clientConn net.Conn, host string) {
    targetConn, err := net.Dial("tcp", host)
    if err != nil {
    log.Println("Failed to connect to target:", err)
    clientConn.Write([]byte("HTTP/1.1 502 Bad Gateway\r\n\r\n"))
    return
    }
    defer targetConn.Close()

    clientConn.Write([]byte("HTTP/1.1 200 Connection Established\r\n\r\n"))

    go io.Copy(targetConn, clientConn)
    io.Copy(clientConn, targetConn)
    }