Commit ed9757b1 authored by Boris Mühmer's avatar Boris Mühmer
Browse files

basic working server and client



Signed-off-by: default avatarBoris Mühmer <boris@muehmer.de>
parent 35fdf002
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
# perplex

Perplex is a simple client-server demo.

## Notes

* [TLS server and client](https://gist.github.com/spikebike/2232102)
* [From TCP to TLS in Go](http://pascal.bach.ch/2015/12/17/from-tcp-to-tls-in-go/)

<!-- End Of File -->
 No newline at end of file
+27 −0
Original line number Diff line number Diff line
package main

import (
	"flag"
	"log"

	"repositories.muehmer.net/bsmrgo/perplex/internal/app/client"
	"repositories.muehmer.net/bsmrgo/perplex/internal/app/client/channel"
)

var (
	tls        = flag.Bool("tls", true, "Connection uses TLS if true, else plain TCP")
	servername = flag.String("server", "localhost", "The server name, defaults to localhost")
)

func main() {
	flag.Parse()
	log.Printf("Started %s.", client.Name())
	defer log.Printf("Terminating %s...", client.Name())

	// get rolling...
	if *tls {
		channel.TLSClient(*servername, client.Handle)
	} else {
		channel.TCPClient(*servername, client.Handle)
	}
}
+27 −0
Original line number Diff line number Diff line
package main

import (
	"flag"
	"log"

	"repositories.muehmer.net/bsmrgo/perplex/internal/app/server"
	"repositories.muehmer.net/bsmrgo/perplex/internal/app/server/channel"
)

var (
	tls        = flag.Bool("tls", true, "Connection uses TLS if true, else plain TCP")
	servername = flag.String("server", "localhost", "The server name, defaults to localhost")
)

func main() {
	flag.Parse()
	log.Printf("Started %s.", server.Name())
	defer log.Printf("Terminating %s...", server.Name())

	// get rolling...
	if *tls {
		channel.TLSServer(*servername, server.Handle)
	} else {
		channel.TCPServer(*servername, server.Handle)
	}
}
+19 −0
Original line number Diff line number Diff line
package channel

import (
	"log"
	"net"

	"repositories.muehmer.net/bsmrgo/perplex/internal/pkg/perplex"
)

// TCPClient prepares a plain TCP connection.
func TCPClient(hostname string, handler func(net.Conn)) {
	conn, err := net.Dial("tcp", perplex.ServernameTCP(hostname))
	if err != nil {
		log.Panic(err)
	}
	defer conn.Close()

	handler(conn)
}
+35 −0
Original line number Diff line number Diff line
package channel

import (
	"crypto/tls"
	"log"
	"net"

	"repositories.muehmer.net/bsmrgo/perplex/internal/pkg/perplex"
)

// TLSClient prepares a TLS secured connection.
func TLSClient(hostname string, handler func(net.Conn)) {
	cert, err := tls.LoadX509KeyPair("../../scripts/certs/client.pem", "../../scripts/certs/client.key")
	if err != nil {
		log.Fatal(err)
	}

	config := tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true}
	conn, err := tls.Dial("tcp", perplex.ServernameTLS(hostname), &config)
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	peerCertificates(conn)
	handler(conn)
}

func peerCertificates(conn *tls.Conn) {
	state := conn.ConnectionState()
	for _, v := range state.PeerCertificates {
		//log.Println(x509.MarshalPKIXPublicKey(v.PublicKey))
		log.Printf("peer certificate: %s", v.Subject)
	}
}
Loading