L'éditeur PHP Xinyi vous emmènera explorer les services cachés persistants de Golang. Golang est un langage de programmation efficace connu pour ses excellentes performances et sa concurrence. À l’ère d’Internet où tout va très vite, les services cachés sont devenus une partie importante de nombreuses applications. Ils offrent un moyen sûr et fiable de faire fonctionner les applications pendant de longues périodes tout en masquant leurs informations internes. Cet article présentera comment implémenter des services cachés persistants dans Golang et explorera ses scénarios d'application et ses avantages dans des applications pratiques. Que vous soyez débutant ou développeur expérimenté, vous acquerrez des connaissances utiles et une expérience pratique. Explorons ensemble ce sujet intéressant !
J'essaie d'héberger un service caché dans Golang en utilisant github.com/cretz/bine/tor. Mais chaque fois que je démarre le programme, un nouveau service caché (avec une nouvelle adresse .onion) est démarré à la place du service caché précédent.
C'est le code que j'utilise
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) } }
J'ai essayé de forcer le programme à utiliser le même DataDir
t, err := tor.Start(nil, &tor.StartConf{DataDir: "data-dir"})
Mais ça ne marche pas.
Vous devez créer et stocker une clé, puis la transmettre à ListenConf :
Voir : https://github.com/cretz/bine/blob/master/tor/listen.go#L56
Remarque :
La bibliothèque que vous utilisez fournit des fonctions pour ce faire.
Faites cela une fois et enregistrez privateKeyString
:
keyPair, _ := ed25519.GenerateKey() privateKeyString := hex.EncodeToString(keyPair.PrivateKey())
Puis dans votre code serveur :
privateKeyBytes, _ := hex.DecodeString(privateKeyString) privateKey := ed25519.PrivateKey(privateKeyBytes) lc := &tor.ListenConf{ Key: privateKey, Version3: true, RemotePorts: []int{80} }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!