diff --git a/cmd/reseed.go b/cmd/reseed.go index 89912cf..81e2a93 100644 --- a/cmd/reseed.go +++ b/cmd/reseed.go @@ -13,6 +13,7 @@ import ( "github.com/MDrollette/i2p-tools/reseed" "github.com/codegangsta/cli" "github.com/cretz/bine/tor" + "github.com/cretz/bine/torutil" "github.com/cretz/bine/torutil/ed25519" ) @@ -125,8 +126,26 @@ func reseedAction(c *cli.Context) { tlsHost := c.String("tlsHost") if c.Bool("onion") { + var ok []byte + var err error if tlsHost == "" { - tlsHost = "onion" + if _, err = os.Stat(c.String("onionKey")); err == nil { + ok, err = ioutil.ReadFile(c.String("onionKey")) + if err != nil { + log.Fatalln(err.Error()) + } + } else { + key, err := ed25519.GenerateKey(nil) + if err != nil { + log.Fatalln(err.Error()) + } + ok = []byte(key.PrivateKey()) + } + tlsHost = torutil.OnionServiceIDFromPrivateKey(ed25519.PrivateKey(ok)) + ".onion" + } + err = ioutil.WriteFile(c.String("onionKey"), ok, 0644) + if err != nil { + log.Fatalln(err.Error()) } } @@ -227,7 +246,6 @@ func reseedAction(c *cli.Context) { DiscardKey: false, }, tlsCert, tlsKey, - c.String("onionKey"), ), ) } else { @@ -242,42 +260,23 @@ func reseedAction(c *cli.Context) { NonAnonymous: c.Bool("singleOnion"), DiscardKey: false, }, - c.String("onionKey"), ), ) } } } else if os.IsNotExist(err) { - if tlsCert != "" && tlsKey != "" { - log.Fatalln( - server.ListenAndServeOnionTLS( - nil, - &tor.ListenConf{ - LocalPort: port, - RemotePorts: []int{443}, - Version3: true, - NonAnonymous: c.Bool("singleOnion"), - DiscardKey: false, - }, - tlsCert, tlsKey, - c.String("onionKey"), - ), - ) - } else { - log.Fatalln( - server.ListenAndServeOnion( - nil, - &tor.ListenConf{ - LocalPort: port, - RemotePorts: []int{80}, - Version3: true, - NonAnonymous: c.Bool("singleOnion"), - DiscardKey: false, - }, - c.String("onionKey"), - ), - ) - } + log.Fatalln( + server.ListenAndServeOnion( + nil, + &tor.ListenConf{ + LocalPort: port, + RemotePorts: []int{80}, + Version3: true, + NonAnonymous: c.Bool("singleOnion"), + DiscardKey: false, + }, + ), + ) } else { } diff --git a/reseed/server.go b/reseed/server.go index 98d1eba..f48e581 100644 --- a/reseed/server.go +++ b/reseed/server.go @@ -5,7 +5,6 @@ import ( "context" "crypto/tls" "io" - "io/ioutil" "log" "net" "net/http" @@ -14,7 +13,6 @@ import ( "time" "github.com/cretz/bine/tor" - "github.com/cretz/bine/torutil/ed25519" "github.com/gorilla/handlers" "github.com/justinas/alice" "github.com/throttled/throttled" @@ -122,7 +120,7 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error { return srv.Serve(tlsListener) } -func (srv *Server) ListenAndServeOnionTLS(startConf *tor.StartConf, listenConf *tor.ListenConf, certFile, keyFile, onionKey string) error { +func (srv *Server) ListenAndServeOnionTLS(startConf *tor.StartConf, listenConf *tor.ListenConf, certFile, keyFile string) error { log.Println("Starting and registering OnionV3 HTTPS service, please wait a couple of minutes...") tor, err := tor.Start(nil, startConf) if err != nil { @@ -133,18 +131,20 @@ func (srv *Server) ListenAndServeOnionTLS(startConf *tor.StartConf, listenConf * listenCtx, listenCancel := context.WithTimeout(context.Background(), 3*time.Minute) defer listenCancel() - if srv.TLSConfig == nil { - srv.TLSConfig = &tls.Config{} - } - - if srv.TLSConfig.NextProtos == nil { - srv.TLSConfig.NextProtos = []string{"http/1.1"} - } srv.OnionListener, err = tor.Listen(listenCtx, listenConf) if err != nil { return err } srv.Addr = srv.OnionListener.ID + if srv.TLSConfig == nil { + srv.TLSConfig = &tls.Config{ + ServerName: srv.OnionListener.ID, + } + } + + if srv.TLSConfig.NextProtos == nil { + srv.TLSConfig.NextProtos = []string{"http/1.1"} + } // var err error srv.TLSConfig.Certificates = make([]tls.Certificate, 1) @@ -153,10 +153,6 @@ func (srv *Server) ListenAndServeOnionTLS(startConf *tor.StartConf, listenConf * return err } - err = ioutil.WriteFile(onionKey, []byte(srv.OnionListener.Key.(ed25519.KeyPair).PrivateKey()), 0644) - if err != nil { - return err - } log.Printf("Onionv3 server started on https://%v.onion\n", srv.OnionListener.ID) tlsListener := tls.NewListener(srv.OnionListener, srv.TLSConfig) @@ -164,7 +160,7 @@ func (srv *Server) ListenAndServeOnionTLS(startConf *tor.StartConf, listenConf * return srv.Serve(tlsListener) } -func (srv *Server) ListenAndServeOnion(startConf *tor.StartConf, listenConf *tor.ListenConf, onionKey string) error { +func (srv *Server) ListenAndServeOnion(startConf *tor.StartConf, listenConf *tor.ListenConf) error { log.Println("Starting and registering OnionV3 service, please wait a couple of minutes...") tor, err := tor.Start(nil, startConf) if err != nil { @@ -178,10 +174,7 @@ func (srv *Server) ListenAndServeOnion(startConf *tor.StartConf, listenConf *tor if err != nil { return err } - err = ioutil.WriteFile(onionKey, []byte(srv.OnionListener.Key.(ed25519.KeyPair).PrivateKey()), 0644) - if err != nil { - return err - } + log.Printf("Onionv3 server started on http://%v.onion\n", srv.OnionListener.ID) return srv.Serve(srv.OnionListener) }