我试图使用github.com/cretz/bine/tor在golang中托管一个隐藏的服务. 但是每次我启动我的程序时,都会启动一个新的隐藏服务(带有新的.onion地址),而不是之前的隐藏服务.

这是我正在使用的代码

package main

import (
    "context"
    "fmt"
    "github.com/cretz/bine/tor"
    "log"
    "net/http"
    "time"
)

func main() {
    // Start tor with default config
    fmt.Println("Starting and registering onion service, please wait a couple of minutes...")
    t, err := tor.Start(nil, nil)
    if err != nil {
        log.Panicf("Unable to start Tor: %v", err)
    }
    defer t.Close()
    // Wait at most a few minutes to publish the service
    listenCtx, listenCancel := context.WithTimeout(context.Background(), 3*time.Minute)
    defer listenCancel()
    // Create a v3 onion service
    onion, err := t.Listen(listenCtx, &tor.ListenConf{Version3: true, RemotePorts: []int{80}})
    if err != nil {
        log.Panicf("Unable to create onion service: %v", err)
    }
    defer onion.Close()
    fmt.Printf("Open Tor browser and navigate to http://%v.onion\n", onion.ID)
    fmt.Println("Press enter to exit")
    // Serve the current folder from HTTP
    errCh := make(chan error, 1)
    go func() { errCh <- http.Serve(onion, http.FileServer(http.Dir("."))) }()
    // End when enter is pressed
    go func() {
        fmt.Scanln()
        errCh <- nil
    }()
    if err = <-errCh; err != nil {
        log.Panicf("Failed serving: %v", err)
    }
}


我try 使用相同的DataDir强制该程序

t, err := tor.Start(nil, &tor.StartConf{DataDir: "data-dir"})

但这行不通.

推荐答案

您需要创建并存储一个密钥,然后将其传递给ListenConf:

请参阅:https://github.com/cretz/bine/blob/master/tor/listen.go#L56

注:

//Key是要使用的私钥.If not present, a key is generated.

您正在使用的库提供了一个执行此操作的函数.

参见:https://github.com/cretz/bine/blob/b9d31d9c786616742e39a121b60522e803e96731/torutil/ed25519/ed25519.go#L132

这样做一次,就可以节省privateKeyString:

keyPair, _ := ed25519.GenerateKey()
privateKeyString := hex.EncodeToString(keyPair.PrivateKey())

然后在您的服务器代码中:

privateKeyBytes, _ := hex.DecodeString(privateKeyString)
privateKey := ed25519.PrivateKey(privateKeyBytes)
lc := &tor.ListenConf{
    Key: privateKey,
    Version3: true,
    RemotePorts: []int{80}
}

Go相关问答推荐

消费者在NAT中是如何实现的

Golang使用Run()执行的命令没有返回

如何在Golang中使用ECHO服务器实现Socket.IO服务器

无法获取RPC描述符

如何在链接中写入链接

我们如何保证取消的上下文会导致 goroutine 终止?

AWS Lambda 中的 Websocket URL 超时达到错误

从给定顶点查找图形中所有闭合路径的算法

加密/椭圆:try 在无效点上进行操作

使用 Go 解组 SOAP 消息

如何匹配两次出现的相同但随机字符串之间的字符

使用 Grafana alert 在几分钟内重复alert

为超时的单元测试创​​建 deadlineExceededError:true

通过环境变量配置 OTLP 导出器

速率限制特定端点

Golang - 将 [8] 布尔转换为字节

如何在Go中替换符号并使下一个字母大写

不能使用 *T 类型的变量作为参数类型

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?

为什么在 unsafe.Sizeof() 中取消引用 nil 指针不会导致panic ?