diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/.gitignore | 1 | ||||
| -rw-r--r-- | server/README.md | 60 | ||||
| -rw-r--r-- | server/main.go | 175 | 
3 files changed, 0 insertions, 236 deletions
| diff --git a/server/.gitignore b/server/.gitignore deleted file mode 100644 index 254defd..0000000 --- a/server/.gitignore +++ /dev/null @@ -1 +0,0 @@ -server diff --git a/server/README.md b/server/README.md deleted file mode 100644 index 71bb3ac..0000000 --- a/server/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Run Trillian + STFE locally -Trillian uses a database.  So, we will need to set that up.  It is documented -[here](https://github.com/google/trillian#mysql-setup), and how to check that it -is setup properly -[here](https://github.com/google/certificate-transparency-go/blob/master/trillian/docs/ManualDeployment.md#data-storage). - -Other than the database we need the Trillian log signer, Trillian log server, -and STFE server. -``` -$ go install github.com/google/trillian/cmd/trillian_log_signer -$ go install github.com/google/trillian/cmd/trillian_log_server -$ go install -``` - -Start Trillian log signer: -``` -trillian_log_signer --logtostderr -v 9 --force_master --rpc_endpoint=localhost:6961 --http_endpoint=localhost:6964 --num_sequencers 1 --sequencer_interval 100ms --batch_size 100 -``` - -Start Trillian log server: -``` -trillian_log_server --logtostderr -v 9 --rpc_endpoint=localhost:6962 --http_endpoint=localhost:6963 -``` - -As described in more detail -[here](https://github.com/google/certificate-transparency-go/blob/master/trillian/docs/ManualDeployment.md#trillian-services), -we need to provision a Merkle tree once: -``` -$ go install github.com/google/trillian/cmd/createtree -$ createtree --admin_server localhost:6962 -<tree id> -``` - -Hang on to `<tree id>`.  Our STFE server will use it when talking to the -Trillian log server to specify which Merkle tree we are working against. - -(If you take a look in the `Trees` table you will see that the tree has been -provisioned.) - -We will also need a public key-pair and log identifier for the STFE server. -``` -$ go install github.com/system-transparency/stfe/types/cmd/new-namespace -sk: <sk> -vk: <vk> -ed25519_v1: <namespace> -``` - -The log's identifier is `<namespace>` and contains the public verification key -`<vk>`.  The log's corresponding secret signing key is `<sk>`. - -Start STFE server: -``` -$ ./server --logtostderr -v 9 --http_endpoint localhost:6965 --log_rpc_server localhost:6962 --trillian_id <tree id> --key <sk> -``` - -If the log is responsive on, e.g., `GET http://localhost:6965/st/v1/get-latest-sth` you -may want to try running -`github.com/system-transparency/stfe/client/cmd/example.sh`.  You need to -configure the log's id though for verification to work (flag `log_id`, which -should be set to the `<namespace>` output above). diff --git a/server/main.go b/server/main.go deleted file mode 100644 index 74e4ad3..0000000 --- a/server/main.go +++ /dev/null @@ -1,175 +0,0 @@ -// Package main provides an STFE server binary -package main - -import ( -	"context" -	"flag" -	"fmt" -	"os" -	"strings" -	"sync" -	"syscall" -	"time" - -	"crypto/ed25519" -	"encoding/base64" -	"net/http" -	"os/signal" - -	"github.com/golang/glog" -	"github.com/google/trillian" -	"github.com/prometheus/client_golang/prometheus/promhttp" -	"github.com/system-transparency/stfe" -	"github.com/system-transparency/stfe/types" -	"google.golang.org/grpc" -) - -var ( -	httpEndpoint    = flag.String("http_endpoint", "localhost:6965", "host:port specification of where stfe serves clients") -	rpcBackend      = flag.String("log_rpc_server", "localhost:6962", "host:port specification of where Trillian serves clients") -	prefix          = flag.String("prefix", "st/v1", "a prefix that proceeds each endpoint path") -	trillianID      = flag.Int64("trillian_id", 0, "log identifier in the Trillian database") -	deadline        = flag.Duration("deadline", time.Second*10, "deadline for backend requests") -	key             = flag.String("key", "", "base64-encoded Ed25519 signing key") -	submitterPolicy = flag.Bool("submitter_policy", false, "whether there is any submitter namespace policy (default: none, accept unregistered submitter namespaces)") -	witnessPolicy   = flag.Bool("witness_policy", false, "whether there is any witness namespace policy (default: none, accept unregistered witness namespaces)") -	submitters      = flag.String("submitters", "", "comma-separated list of trusted submitter namespaces in base64 (default: none)") -	witnesses       = flag.String("witnesses", "", "comma-separated list of trusted submitter namespaces in base64 (default: none)") -	maxRange        = flag.Int64("max_range", 10, "maximum number of entries that can be retrived in a single request") -	interval        = flag.Duration("interval", time.Minute*10, "interval used to rotate the log's cosigned STH") -) - -func main() { -	flag.Parse() -	defer glog.Flush() - -	// wait for clean-up before exit -	var wg sync.WaitGroup -	defer wg.Wait() -	ctx, cancel := context.WithCancel(context.Background()) -	defer cancel() - -	glog.V(3).Infof("configuring stfe instance...") -	instance, err := setupInstanceFromFlags() -	if err != nil { -		glog.Errorf("setupInstance: %v", err) -		return -	} - -	glog.V(3).Infof("spawning SthSource") -	go func() { -		wg.Add(1) -		defer wg.Done() -		instance.SthSource.Run(ctx) -		glog.Errorf("SthSource shutdown") -		cancel() // must have SthSource running -	}() - -	glog.V(3).Infof("spawning await") -	server := http.Server{Addr: *httpEndpoint} -	go await(ctx, func() { -		wg.Add(1) -		defer wg.Done() -		ctxInner, _ := context.WithTimeout(ctx, time.Second*60) -		glog.Infof("Shutting down HTTP server...") -		server.Shutdown(ctxInner) -		glog.V(3).Infof("HTTP server shutdown") -		glog.Infof("Shutting down spawned go routines...") -		cancel() -	}) - -	glog.Infof("Serving on %v/%v", *httpEndpoint, *prefix) -	if err = server.ListenAndServe(); err != http.ErrServerClosed { -		glog.Errorf("ListenAndServe: %v", err) -	} -} - -// SetupInstance sets up a new STFE instance from flags -func setupInstanceFromFlags() (*stfe.Instance, error) { -	// Trillian gRPC connection -	dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(*deadline)} -	conn, err := grpc.Dial(*rpcBackend, dialOpts...) -	if err != nil { -		return nil, fmt.Errorf("Dial: %v", err) -	} -	client := trillian.NewTrillianLogClient(conn) -	// HTTP multiplexer -	mux := http.NewServeMux() -	http.Handle("/", mux) -	// Prometheus metrics -	glog.V(3).Infof("Adding prometheus handler on path: /metrics") -	http.Handle("/metrics", promhttp.Handler()) -	// Trusted submitters -	submitters, err := newNamespacePoolFromString(*submitters) -	if err != nil { -		return nil, fmt.Errorf("submitters: newNamespacePoolFromString: %v", err) -	} -	// Trusted witnesses -	witnesses, err := newNamespacePoolFromString(*witnesses) -	if err != nil { -		return nil, fmt.Errorf("witnesses: NewNamespacePool: %v", err) -	} -	// Log identity -	sk, err := base64.StdEncoding.DecodeString(*key) -	if err != nil { -		return nil, fmt.Errorf("sk: DecodeString: %v", err) -	} -	signer := ed25519.PrivateKey(sk) -	logId, err := types.NewNamespaceEd25519V1([]byte(ed25519.PrivateKey(sk).Public().(ed25519.PublicKey))) -	if err != nil { -		return nil, fmt.Errorf("NewNamespaceEd25519V1: %v", err) -	} -	// Setup log parameters -	lp, err := stfe.NewLogParameters(signer, logId, *trillianID, *prefix, submitters, witnesses, *maxRange, *interval, *deadline, *submitterPolicy, *witnessPolicy) -	if err != nil { -		return nil, fmt.Errorf("NewLogParameters: %v", err) -	} -	// Setup STH source -	source, err := stfe.NewActiveSthSource(client, lp) -	if err != nil { -		return nil, fmt.Errorf("NewActiveSthSource: %v", err) -	} -	// Setup log instance -	i := &stfe.Instance{client, lp, source} -	for _, handler := range i.Handlers() { -		glog.V(3).Infof("adding handler: %s", handler.Path()) -		mux.Handle(handler.Path(), handler) -	} -	return i, nil -} - -// newNamespacePoolFromString creates a new namespace pool from a -// comma-separated list of serialized and base64-encoded namespaces. -func newNamespacePoolFromString(str string) (*types.NamespacePool, error) { -	var namespaces []*types.Namespace -	if len(str) > 0 { -		for _, b64 := range strings.Split(str, ",") { -			b, err := base64.StdEncoding.DecodeString(b64) -			if err != nil { -				return nil, fmt.Errorf("DecodeString: %v", err) -			} -			var namespace types.Namespace -			if err := types.Unmarshal(b, &namespace); err != nil { -				return nil, fmt.Errorf("Unmarshal: %v", err) -			} -			namespaces = append(namespaces, &namespace) -		} -	} -	pool, err := types.NewNamespacePool(namespaces) -	if err != nil { -		return nil, fmt.Errorf("NewNamespacePool: %v", err) -	} -	return pool, nil -} - -// await waits for a shutdown signal and then runs a clean-up function -func await(ctx context.Context, done func()) { -	sigs := make(chan os.Signal, 1) -	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) -	select { -	case <-sigs: -	case <-ctx.Done(): -	} -	glog.V(3).Info("received shutdown signal") -	done() -} | 
