// TestWithClientCertificateAuthentication // Use two CA:s in two different files and test that clients with client signed by either of them can connect func (s *HTTPSSuite) TestWithClientCertificateAuthenticationMultipeCAsMultipleFiles(c *check.C) { cmd := exec.Command(traefikBinary, "--configFile=fixtures/https/clientca/https_2ca2config.toml") err := cmd.Start() c.Assert(err, checker.IsNil) defer cmd.Process.Kill() time.Sleep(500 * time.Millisecond) tlsConfig := &tls.Config{ InsecureSkipVerify: true, ServerName: "snitest.com", Certificates: []tls.Certificate{}, } // Connection without client certificate should fail conn, err := tls.Dial("tcp", "127.0.0.1:4443", tlsConfig) c.Assert(err, checker.NotNil, check.Commentf("should not be allowed to connect to server")) // Connect with client signed by ca1 cert, err := tls.LoadX509KeyPair("fixtures/https/clientca/client1.crt", "fixtures/https/clientca/client1.key") c.Assert(err, checker.IsNil, check.Commentf("unable to load client certificate and key")) tlsConfig.Certificates = append(tlsConfig.Certificates, cert) conn, err = tls.Dial("tcp", "127.0.0.1:4443", tlsConfig) c.Assert(err, checker.IsNil, check.Commentf("failed to connect to server")) conn.Close() // Connect with client signed by ca2 tlsConfig = &tls.Config{ InsecureSkipVerify: true, ServerName: "snitest.com", Certificates: []tls.Certificate{}, } cert, err = tls.LoadX509KeyPair("fixtures/https/clientca/client2.crt", "fixtures/https/clientca/client2.key") c.Assert(err, checker.IsNil, check.Commentf("unable to load client certificate and key")) tlsConfig.Certificates = append(tlsConfig.Certificates, cert) conn, err = tls.Dial("tcp", "127.0.0.1:4443", tlsConfig) c.Assert(err, checker.IsNil, check.Commentf("failed to connect to server")) conn.Close() // Connect with client signed by ca3 should fail tlsConfig = &tls.Config{ InsecureSkipVerify: true, ServerName: "snitest.com", Certificates: []tls.Certificate{}, } cert, err = tls.LoadX509KeyPair("fixtures/https/clientca/client3.crt", "fixtures/https/clientca/client3.key") c.Assert(err, checker.IsNil, check.Commentf("unable to load client certificate and key")) tlsConfig.Certificates = append(tlsConfig.Certificates, cert) conn, err = tls.Dial("tcp", "127.0.0.1:4443", tlsConfig) c.Assert(err, checker.NotNil, check.Commentf("should not be allowed to connect to server")) }
func TestTLSTransport(t *testing.T) { certFile := "./ssl-cert-snakeoil.pem" keyFile := "./ssl-cert-snakeoil.key" cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { t.Fatalf("Cannot load TLS certificates: [%s]", err) } serverCfg := &tls.Config{ Certificates: []tls.Certificate{cert}, } clientCfg := &tls.Config{ InsecureSkipVerify: true, } addr := getRandomAddr() s := NewTLSServer(addr, echoHandler, serverCfg) if err := s.Start(); err != nil { t.Fatalf("Server.Start() failed: [%s]", err) } defer s.Stop() c := NewTLSClient(addr, clientCfg) c.Start() defer c.Stop() testIntClient(t, c) }
func setupTLSConfig(sslOpts *SslOptions) (*tls.Config, error) { certPool := x509.NewCertPool() // ca cert is optional if sslOpts.CaPath != "" { pem, err := ioutil.ReadFile(sslOpts.CaPath) if err != nil { return nil, fmt.Errorf("connectionpool: unable to open CA certs: %v", err) } if !certPool.AppendCertsFromPEM(pem) { return nil, errors.New("connectionpool: failed parsing or CA certs") } } mycert, err := tls.LoadX509KeyPair(sslOpts.CertPath, sslOpts.KeyPath) if err != nil { return nil, fmt.Errorf("connectionpool: unable to load X509 key pair: %v", err) } config := &tls.Config{ Certificates: []tls.Certificate{mycert}, RootCAs: certPool, } config.InsecureSkipVerify = !sslOpts.EnableHostVerification return config, nil }
func NewTLSConfig(certFile, keyFile, caCertFile string) (*tls.Config, error) { tlsCert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, fmt.Errorf("failed to load keypair: %s", err.Error()) } tlsConfig := &tls.Config{ Certificates: []tls.Certificate{tlsCert}, InsecureSkipVerify: false, ClientAuth: tls.RequireAndVerifyClientCert, MinVersion: tls.VersionTLS12, } if caCertFile != "" { certBytes, err := ioutil.ReadFile(caCertFile) if err != nil { return nil, fmt.Errorf("failed read ca cert file: %s", err.Error()) } caCertPool := x509.NewCertPool() if ok := caCertPool.AppendCertsFromPEM(certBytes); !ok { return nil, errors.New("Unable to load caCert") } tlsConfig.RootCAs = caCertPool tlsConfig.ClientCAs = caCertPool } return tlsConfig, nil }
func openTLSClient(ipPort string) (*tls.Conn, error) { // Note this loads standard x509 certificates, test keys can be // generated with makecert.sh log.Printf("Loading certificates from directory: %s\n", *certDir) cert, err := tls.LoadX509KeyPair(*certDir+"/server.pem", *certDir+"/server.key") if err != nil { log.Fatalf("server: loadkeys: %s", err) } // InsecureSkipVerify required for unsigned certs with Go1 and later. config := tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true} conn, err := tls.Dial("tcp", ipPort, &config) if err != nil { log.Fatalf("client: dial: %s", err) } log.Println("client: connected to: ", conn.RemoteAddr()) // This shows the public key of the server, we will accept any key, but // we could terminate the connection based on the public key if desired. state := conn.ConnectionState() for _, v := range state.PeerCertificates { log.Printf("Client: Server public key is:\n%x\n", v.PublicKey.(*rsa.PublicKey).N) } // Lets verify behind the doubt that both ends of the connection // have completed the handshake and negotiated a SSL connection log.Println("client: handshake: ", state.HandshakeComplete) log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) // All TLS handling has completed, now to pass the connection off to // go-rpcgen/protobuf/AddService return conn, err }
// Overridden version of net/http added so we can manage the listener. func (s *Server) listenAndServeTLS(certFile, keyFile string) error { addr := s.Server.Addr if addr == "" { addr = ":https" } config := &tls.Config{} if s.Server.TLSConfig != nil { *config = *s.Server.TLSConfig } if config.NextProtos == nil { config.NextProtos = []string{"http/1.1"} } var err error config.Certificates = make([]tls.Certificate, 1) config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return err } conn, err := net.Listen("tcp", addr) if err != nil { return err } tlsListener := tls.NewListener(conn, config) s.listener = tlsListener return s.Server.Serve(tlsListener) }
func NewSSLTestServer(t testing.TB, protocol uint8) *TestServer { pem, err := ioutil.ReadFile("testdata/pki/ca.crt") certPool := x509.NewCertPool() if !certPool.AppendCertsFromPEM(pem) { t.Fatalf("Failed parsing or appending certs") } mycert, err := tls.LoadX509KeyPair("testdata/pki/cassandra.crt", "testdata/pki/cassandra.key") if err != nil { t.Fatalf("could not load cert") } config := &tls.Config{ Certificates: []tls.Certificate{mycert}, RootCAs: certPool, } listen, err := tls.Listen("tcp", "127.0.0.1:0", config) if err != nil { t.Fatal(err) } headerSize := 8 if protocol > protoVersion2 { headerSize = 9 } srv := &TestServer{ Address: listen.Addr().String(), listen: listen, t: t, protocol: protocol, headerSize: headerSize, quit: make(chan struct{}), } go srv.serve() return srv }
// New Apn with cert_filename and key_filename. func New(cert_filename string, key_filename string, server string, timeout time.Duration, buffer int) (*Apn, error) { echan := make(chan error) cert, err := tls.LoadX509KeyPair(cert_filename, key_filename) if err != nil { return nil, err } nameport := strings.Split(server, ":") certificate := []tls.Certificate{cert} conf := &tls.Config{ Certificates: certificate, ServerName: nameport[0], } ret := &Apn{ ErrorChan: echan, server: server, conf: conf, timeout: timeout, sendChan: make(chan *sendArg), errorChan: echan, buffer: buffer, sentChan: make(chan *sendArg, buffer), } go sendLoop(ret) return ret, err }
func clientTLS() *tls.Config { tlsConfig := &tls.Config{} cert, err := tls.LoadX509KeyPair("test/client0.crt", "test/client0.key") if err != nil { log.Fatalf("Can not load certificate: %s", err.Error()) } tlsConfig.Certificates = []tls.Certificate{cert} certPool := x509.NewCertPool() pem, err := ioutil.ReadFile("test/ca.crt") if err != nil { log.Fatalf("Can not read CA for client tls: %s", err.Error()) } ok := certPool.AppendCertsFromPEM(pem) if !ok { log.Fatalf("Can not append cert") } tlsConfig.RootCAs = certPool return tlsConfig }
// apps will set two OS variables: // atscale_http_sslcert - location of the http ssl cert // atscale_http_sslkey - location of the http ssl key func NewTimeoutClient(cTimeout time.Duration, rwTimeout time.Duration, useClientCerts bool) *http.Client { certLocation := os.Getenv("atscale_http_sslcert") keyLocation := os.Getenv("atscale_http_sslkey") caFile := os.Getenv("atscale_ca_file") // default tlsConfig := &tls.Config{InsecureSkipVerify: true} if useClientCerts && len(certLocation) > 0 && len(keyLocation) > 0 { // Load client cert if available cert, err := tls.LoadX509KeyPair(certLocation, keyLocation) if err == nil { if len(caFile) > 0 { caCertPool := x509.NewCertPool() caCert, err := ioutil.ReadFile(caFile) if err != nil { fmt.Printf("Error setting up caFile [%s]:%v\n", caFile, err) } caCertPool.AppendCertsFromPEM(caCert) tlsConfig = &tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true, RootCAs: caCertPool} tlsConfig.BuildNameToCertificate() } else { tlsConfig = &tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true} } } } return &http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConfig, Dial: timeoutDialer(cTimeout, rwTimeout), }, } }
// The rest of the functionality of getTrustService depends upon // utils.ConfigureClientTLS, so this test just asserts that if successful, // the correct tls.Config is returned based on all the configuration parameters func TestGetTrustServiceTLSSuccess(t *testing.T) { keypair, err := tls.LoadX509KeyPair(Cert, Key) assert.NoError(t, err, "Unable to load cert and key for testing") tlspart := fmt.Sprintf(`"tls_client_cert": "%s", "tls_client_key": "%s"`, Cert, Key) var registerCalled = 0 var fakeRegister = func(_ string, _ func() error, _ time.Duration) { registerCalled++ } var tlsConfig *tls.Config var fakeNewSigner = func(_, _ string, c *tls.Config) *client.NotarySigner { tlsConfig = c return &client.NotarySigner{} } trust, algo, err := getTrustService( configure(fmt.Sprintf(trustTLSConfigTemplate, tlspart)), fakeNewSigner, fakeRegister) assert.NoError(t, err) assert.IsType(t, &client.NotarySigner{}, trust) assert.Equal(t, "ecdsa", algo) assert.Len(t, tlsConfig.Certificates, 1) assert.True(t, reflect.DeepEqual(keypair, tlsConfig.Certificates[0])) // health function registered assert.Equal(t, 1, registerCalled) }
func (p *apnsPushService) reconnect(psp *PushServiceProvider) (net.Conn, error) { name := psp.Name() p.connLock.Lock() defer p.connLock.Unlock() if conn, ok := p.conns[name]; ok { conn.Close() } cert, err := tls.LoadX509KeyPair(psp.FixedData["cert"], psp.FixedData["key"]) if err != nil { return nil, NewBadPushServiceProviderWithDetails(psp, err.Error()) } conf := &tls.Config{ Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true, } tlsconn, err := tls.Dial("tcp", psp.VolatileData["addr"], conf) if err != nil { return nil, NewConnectionError(err) } err = tlsconn.Handshake() if err != nil { return nil, NewConnectionError(err) } p.conns[name] = tlsconn return tlsconn, nil }
// ListenTLS is a convenience method that creates an https listener using the // provided cert and key files. Use this method if you need access to the // listener object directly. When ready, pass it to the Serve method. func (srv *Server) ListenTLS(certFile, keyFile string) (net.Listener, error) { // Create the listener ourselves so we can control its lifetime addr := srv.Addr if addr == "" { addr = ":https" } config := &tls.Config{} if srv.TLSConfig != nil { *config = *srv.TLSConfig } var err error config.Certificates = make([]tls.Certificate, 1) config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, err } conn, err := srv.newTCPListener(addr) if err != nil { return nil, err } srv.TLSConfig = config tlsListener := tls.NewListener(conn, config) return tlsListener, nil }
func listenTLS(addr string) (net.Listener, error) { host, _, err := net.SplitHostPort(addr) if err != nil { return nil, fmt.Errorf("Unable to split host and port for %v: %v\n", addr, err) } ctx := CertContext{ PKFile: "key.pem", ServerCertFile: "cert.pem", } err = ctx.InitServerCert(host) if err != nil { return nil, fmt.Errorf("Unable to init server cert: %s\n", err) } tlsConfig := tlsdefaults.Server() cert, err := tls.LoadX509KeyPair(ctx.ServerCertFile, ctx.PKFile) if err != nil { return nil, fmt.Errorf("Unable to load certificate and key from %s and %s: %s\n", ctx.ServerCertFile, ctx.PKFile, err) } tlsConfig.Certificates = []tls.Certificate{cert} listener, err := tls.Listen("tcp", addr, tlsConfig) if err != nil { return nil, fmt.Errorf("Unable to listen for tls connections at %s: %s\n", addr, err) } return listener, err }
// ListenAndServeTLS provides a graceful equivalent of net/http.Serve.ListenAndServeTLS. func (s *GracefulServer) ListenAndServeTLS(certFile, keyFile string) error { // direct lift from net/http/server.go addr := s.Addr if addr == "" { addr = ":https" } config := &tls.Config{} if s.TLSConfig != nil { *config = *s.TLSConfig } if config.NextProtos == nil { config.NextProtos = []string{"http/1.1"} } var err error config.Certificates = make([]tls.Certificate, 1) config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return err } ln, err := net.Listen("tcp", addr) if err != nil { return err } return s.Serve(tls.NewListener(ln, config)) }
// NewTLSServer creates and starts a TLS-enabled testing server. func NewTLSServer(bind string, containerChan chan<- *docker.Container, hook func(*http.Request), tlsConfig TLSConfig) (*DockerServer, error) { listener, err := net.Listen("tcp", bind) if err != nil { return nil, err } defaultCertificate, err := tls.LoadX509KeyPair(tlsConfig.CertPath, tlsConfig.CertKeyPath) if err != nil { return nil, err } tlsServerConfig := new(tls.Config) tlsServerConfig.Certificates = []tls.Certificate{defaultCertificate} if tlsConfig.RootCAPath != "" { rootCertPEM, err := ioutil.ReadFile(tlsConfig.RootCAPath) if err != nil { return nil, err } certsPool := x509.NewCertPool() certsPool.AppendCertsFromPEM(rootCertPEM) tlsServerConfig.RootCAs = certsPool } tlsListener := tls.NewListener(listener, tlsServerConfig) server := buildDockerServer(tlsListener, containerChan, hook) go http.Serve(tlsListener, server) return server, nil }
// Load the TLS certificates/keys and, if verify is true, the CA. func loadTLSConfig(ca, cert, key string, verify bool) (*tls.Config, error) { c, err := tls.LoadX509KeyPair(cert, key) if err != nil { return nil, fmt.Errorf("Couldn't load X509 key pair (%s, %s): %s. Key encrypted?", cert, key, err) } config := &tls.Config{ Certificates: []tls.Certificate{c}, MinVersion: tls.VersionTLS10, } if verify { certPool := x509.NewCertPool() file, err := ioutil.ReadFile(ca) if err != nil { return nil, fmt.Errorf("Couldn't read CA certificate: %s", err) } certPool.AppendCertsFromPEM(file) config.RootCAs = certPool config.ClientAuth = tls.RequireAndVerifyClientCert config.ClientCAs = certPool } else { // If --tlsverify is not supplied, disable CA validation. config.InsecureSkipVerify = true } return config, nil }
func SetupTCP(useTls bool, address string) { println("Setting Up TCP at:", address) const connectedAndWaitingMax = 0 conChan := make(chan net.Conn, connectedAndWaitingMax) halt := make(chan int) var listener net.Listener var err os.Error if useTls { certs := make([]tls.Certificate, 1) c0, errx := tls.LoadX509KeyPair("cert/cert.pem", "cert/key.pem") certs[0] = c0 fmt.Println(errx) config := tls.Config{Certificates: certs, ServerName: "TestServer"} listener, err = tls.Listen("tcp", ":6666", &config) println("TLS") } else { listener, err = net.Listen("tcp", ":6666") println("TCP") } if err != nil { println(err) } go getConnections(listener, conChan, halt) conChan2 := make(chan *LoggedIn, connectedAndWaitingMax) go welcomTestLoop(conChan, conChan2) go updateLoop(conChan2) println("TCP Setup") }
func startHttp() { http.HandleFunc("/register", register) http.HandleFunc("/unregister", unregister) laddr := fmt.Sprintf(":%d", *port) tlsConfig := tlsdefaults.Server() _, _, err := keyman.StoredPKAndCert(PKFile, CertFile, "Lantern", "localhost") if err != nil { log.Fatalf("Unable to initialize private key and certificate: %v", err) } cert, err := tls.LoadX509KeyPair(CertFile, PKFile) if err != nil { log.Fatalf("Unable to load certificate and key from %s and %s: %s", CertFile, PKFile, err) } tlsConfig.Certificates = []tls.Certificate{cert} log.Debugf("About to listen at %v", laddr) l, err := tls.Listen("tcp", laddr, tlsConfig) if err != nil { log.Fatalf("Unable to listen for tls connections at %s: %s", laddr, err) } log.Debug("About to serve") err = http.Serve(l, nil) if err != nil { log.Fatalf("Unable to serve: %s", err) } }
func setupTls(cert, key, ca string, l net.Listener) (net.Listener, error) { tlsCert, err := tls.LoadX509KeyPair(cert, key) if err != nil { return nil, fmt.Errorf("Couldn't load X509 key pair (%s, %s): %s. Key encrypted?", cert, key, err) } tlsConfig := &tls.Config{ NextProtos: []string{"http/1.1"}, Certificates: []tls.Certificate{tlsCert}, // Avoid fallback on insecure SSL protocols MinVersion: tls.VersionTLS10, } if ca != "" { certPool := x509.NewCertPool() file, err := ioutil.ReadFile(ca) if err != nil { return nil, fmt.Errorf("Couldn't read CA certificate: %s", err) } certPool.AppendCertsFromPEM(file) tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert tlsConfig.ClientCAs = certPool } return tls.NewListener(l, tlsConfig), nil }
func main() { pool := x509.NewCertPool() caCrt, err := ioutil.ReadFile("/home/vcap/kubelet/ca.crt") if err != nil { fmt.Println(err) return } pool.AppendCertsFromPEM(caCrt) cliCrt, err := tls.LoadX509KeyPair("/home/vcap/kubelet/client.crt", "/home/vcap/kubelet/client.key") if err != nil { fmt.Println(err) return } tr := &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: pool, Certificates: []tls.Certificate{cliCrt}, }, } client := &http.Client{Transport: tr} resp, err := client.Get("https://localhost:10250") if err != nil { fmt.Println(err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) }
// NewClient returns a new docker test client. func NewClient() ( cli *client.DockerCli, stdout *io.PipeReader, stdoutPipe *io.PipeWriter) { proto, addr, _ := DockerHost() stdout, stdoutPipe = io.Pipe() dockerCertPath := os.Getenv("DOCKER_CERT_PATH") // Boot2docker use TLS per default, Jenkins not if dockerCertPath != "" { var ( tlsConfig tls.Config ) tlsConfig.InsecureSkipVerify = true flCert := filepath.Join(dockerCertPath, defaultCertFile) flKey := filepath.Join(dockerCertPath, defaultKeyFile) _, errCert := os.Stat(flCert) _, errKey := os.Stat(flKey) if errCert == nil && errKey == nil { cert, err := tls.LoadX509KeyPair(flCert, flKey) if err != nil { log.Fatalf("Couldn't load X509 key pair: %s. Key encrypted?", err) } tlsConfig.Certificates = []tls.Certificate{cert} } // Avoid fallback to SSL protocols < TLS1.0 tlsConfig.MinVersion = tls.VersionTLS10 cli = client.NewDockerCli(nil, stdoutPipe, nil, nil, proto, addr, &tlsConfig) } else { cli = client.NewDockerCli(nil, stdoutPipe, nil, nil, proto, addr, nil) } return }
// NewServerTLSFromFile constructs a TLS from the input certificate file and key // file for server. func NewServerTLSFromFile(certFile, keyFile string) (TransportAuthenticator, error) { cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, err } return NewTLS(&tls.Config{Certificates: []tls.Certificate{cert}}), nil }
// ListenAndServeTLS listens on the TCP network address srv.Addr and // then calls Serve to handle requests on incoming TLS connections. // // Filenames containing a certificate and matching private key for // the server must be provided. If the certificate is signed by a // certificate authority, the certFile should be the concatenation // of the server's certificate followed by the CA's certificate. // // If srv.Addr is blank, ":https" is used. func (s *Server) ListenAndServeTLS(certFile, keyFile string) os.Error { addr := s.Addr if addr == "" { addr = ":https" } config := &tls.Config{ Rand: rand.Reader, Time: time.Seconds, NextProtos: []string{"http/1.1"}, } var err os.Error config.Certificates = make([]tls.Certificate, 1) config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return err } conn, err := net.Listen("tcp", addr) if err != nil { return err } tlsListener := tls.NewListener(conn, config) return s.Serve(tlsListener) }
func getConfig(address, cert, key, caCert string) (*vaultapi.Config, error) { conf := vaultapi.DefaultConfig() conf.Address = address tlsConfig := &tls.Config{} if cert != "" && key != "" { clientCert, err := tls.LoadX509KeyPair(cert, key) if err != nil { return nil, err } tlsConfig.Certificates = []tls.Certificate{clientCert} tlsConfig.BuildNameToCertificate() } if caCert != "" { ca, err := ioutil.ReadFile(caCert) if err != nil { return nil, err } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(ca) tlsConfig.RootCAs = caCertPool } conf.HttpClient.Transport = &http.Transport{ TLSClientConfig: tlsConfig, } return conf, nil }
func serve(listener net.Listener) { certificate, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { panic(err) } for { c, err := listener.Accept() if err != nil { log.Printf("accept: %s", err) } tlsConn := tls.Server(c, &tls.Config{ Certificates: []tls.Certificate{certificate}, }) if err := tlsConn.Handshake(); err != nil { log.Printf("tls: %s", err) } go func() { io.Copy(os.Stdout, tlsConn) c.Close() }() go func() { io.Copy(tlsConn, os.Stdin) c.Close() }() } }
// ListenAndServeTLS is equivalent to http.Server.ListenAndServeTLS with graceful shutdown enabled. func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error { // Create the listener ourselves so we can control its lifetime addr := srv.Addr if addr == "" { addr = ":https" } config := &tls.Config{} if srv.TLSConfig != nil { *config = *srv.TLSConfig } if config.NextProtos == nil { config.NextProtos = []string{"http/1.1"} } var err error config.Certificates = make([]tls.Certificate, 1) config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return err } conn, err := net.Listen("tcp", addr) if err != nil { return err } tlsListener := tls.NewListener(conn, config) return srv.Serve(tlsListener) }
func listenTCPServer(addr string, vs *vpsServer) (net.Listener, error) { if len(addr) == 0 { log.Fatalf("Empty listen address.") return nil, nil } //var lp *net.TCPListener lp, err := net.Listen("tcp", addr) if nil != err { log.Printf("Can NOT listen on address:%s", addr) return nil, err } if len(remote.ServerConf.TLS.Cert) > 0 { tlscfg := &tls.Config{} tlscfg.Certificates = make([]tls.Certificate, 1) tlscfg.Certificates[0], err = tls.LoadX509KeyPair(remote.ServerConf.TLS.Cert, remote.ServerConf.TLS.Key) if nil != err { log.Fatalf("Invalid cert/key for reason:%v", err) return nil, nil } lp = tls.NewListener(lp, tlscfg) } tcpaddr := lp.Addr().(*net.TCPAddr) log.Printf("Listen on address %v", tcpaddr) if nil != vs { vs.port = uint32(tcpaddr.Port) vs.lp = lp vs.createTime = time.Now() } return lp, nil }
func serverMethodSelected(method uint8, conn net.Conn) (net.Conn, error) { switch method { case MethodTLS: var cert tls.Certificate var err error if len(CertFile) == 0 || len(KeyFile) == 0 { cert, err = tls.X509KeyPair([]byte(rawCert), []byte(rawKey)) } else { cert, err = tls.LoadX509KeyPair(CertFile, KeyFile) } if err != nil { return nil, err } conn = tls.Server(conn, &tls.Config{Certificates: []tls.Certificate{cert}}) if err := svrTLSAuth(conn); err != nil { return nil, err } case MethodAES128, MethodAES192, MethodAES256, MethodDES, MethodBF, MethodCAST5, MethodRC4MD5, MethodRC4, MethodTable: cipher, err := shadowsocks.NewCipher(Methods[method], Password) if err != nil { return nil, err } conn = shadowsocks.NewConn(conn, cipher) case gosocks5.MethodNoAcceptable: return nil, gosocks5.ErrBadMethod } return conn, nil }
func CreateTlsClient(certFile, keyFile, caFile string) (client *http.Client, err error) { // Load client cert cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { log.Println("Cannot load client cert", err) return } // Load CA cert caCert, err := ioutil.ReadFile(caFile) if err != nil { log.Println("Cannot get caFile:", err) return } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) // Setup HTTPS client tlsConfig := &tls.Config{ Certificates: []tls.Certificate{cert}, RootCAs: caCertPool, } tlsConfig.BuildNameToCertificate() transport := &http.Transport{TLSClientConfig: tlsConfig} client = &http.Client{Transport: transport} return }