[英]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.