繁体   English   中英

如何使用系统调用发出原始 HTTPS 请求

[英]How to make raw HTTPS requests using syscall

我正在尝试使用 Go 中的“系统调用”模块发出原始 HTTPS 请求。 如果我使用“net”,我可以使用 tls.Client 将 net.Conn 转换为 tls.Conn 并正常向 HTTPS 网站发出请求,但系统调用中似乎没有类似的 function。 我该怎么做?

P/S:这是我在系统调用中发出 HTTP 请求的代码:package main

import (
    "syscall"
    "time"
)
func main() {
    for i := 0; i < 100; i++ {
        go func() {
            sysCall, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
            if err != nil {
                panic(err)
            }
            address := syscall.SockaddrInet4{
                Port: 80,
                Addr: [4]byte{78, 31, 67, 223},
            }
            connErr := syscall.Connect(sysCall, &address)
            if connErr != nil {
                panic(err)
            }
            func() {
                defer syscall.Close(sysCall)
                _, err = syscall.Write(sysCall, []byte("GET / HTTP/1.1\r\nHost: 78.31.67.223\r\n\r\n"))
                if err != nil {
                    panic(err)
                }
            }()
        }()
    }
    time.Sleep(10 * time.Second)
}

TLS 在用户空间中处理,而不是在操作系统 kernel 中处理。 这意味着没有用于处理 HTTPS 或 TLS 的系统调用。 相反,完整的 TLS 堆栈需要在用户空间中实现,并且只能使用系统调用发送和接收 TCP 级别的数据(即 TLS 握手、加密的有效负载)。

鉴于tls.Conn object可以从 net.Conn 创建,它应该可以使用系统调用实现您自己的 net.Conn 兼容类型,然后为此使用 crypto/tls 作为 TLS 堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM