// Connect to a STOMP broker using TLS and disconnect. func main() { st := time.Now() ll.Printf("%stag:%s connsess:%s starts\n", exampid, tag, sngecomm.Lcs) flag.Parse() // Parse flags ll.Printf("%stag:%s connsess:%s main_using_srvCAFile:%s\n", exampid, tag, sngecomm.Lcs, srvCAFile) // TLS Configuration. tc = new(tls.Config) tc.InsecureSkipVerify = false // *Do* check the broker's certificate // Be polite, allow SNI (Server Virtual Hosting) tc.ServerName = senv.Host() // Usually one will use the default cipher suites that go provides. // However, if a custom cipher squite list is needed/required this // is how it is accomplished. if sngecomm.UseCustomCiphers() { // Set custom cipher suite list tc.CipherSuites = append(tc.CipherSuites, sngecomm.CustomCiphers()...) } // Finish TLS Config initialization, so client can authenticate broker. b, e := ioutil.ReadFile(srvCAFile) // Read broker's CA cert (PEM) if e != nil { ll.Fatalf("%stag:%s connsess:%s main_read_file error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } k, _ := pem.Decode(b) // Decode PEM format (*pem.Block) if k == nil { ll.Fatalf("%stag:%s connsess:%s main_decode error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } c, e := x509.ParseCertificate(k.Bytes) // Create *x509.Certificate if e != nil { ll.Fatalf("%stag:%s connsess:%s main_parse_cert error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } tc.RootCAs = x509.NewCertPool() // Create a cert "pool" tc.RootCAs.AddCert(c) // Add the CA cert to the pool // Standard example TLS connect sequence n, conn, e := sngecomm.CommonTLSConnect(exampid, tag, ll, tc) if e != nil { ll.Fatalf("%stag:%s connsess:%s main_on_connect error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } nc := n.(*tls.Conn) sngecomm.DumpTLSConfig(exampid, tc, nc) // *NOTE* application specific functionaltiy starts here! // For you to add. // *NOTE* application specific functionaltiy ends here! // Standard example disconnect sequence e = sngecomm.CommonDisconnect(n, conn, exampid, tag, ll) if e != nil { ll.Fatalf("%s %s\n", exampid, e.Error()) // Handle this ...... } ll.Printf("%stag:%s connsess:%s main_elapsed:%v\n", exampid, tag, conn.Session(), time.Now().Sub(st)) }
// Connect to a STOMP broker using TLS and disconnect. func main() { st := time.Now() ll.Printf("%stag:%s connsess:%s starts\n", exampid, tag, sngecomm.Lcs) flag.Parse() // Parse flags ll.Printf("%stag:%s connsess:%s main_using_cliCertFile:%s\n", exampid, tag, sngecomm.Lcs, cliCertFile) ll.Printf("%stag:%s connsess:%s main_using_cliKeyFile:%s\n", exampid, tag, sngecomm.Lcs, cliKeyFile) // TLS Configuration. tc = new(tls.Config) tc.InsecureSkipVerify = true // Do *not* check the broker's certificate // Be polite, allow SNI (Server Virtual Hosting) tc.ServerName = senv.Host() // Usually one will use the default cipher suites that go provides. // However, if a custom cipher squite list is needed/required this // is how it is accomplished. if sngecomm.UseCustomCiphers() { // Set custom cipher suite list tc.CipherSuites = append(tc.CipherSuites, sngecomm.CustomCiphers()...) } // Finish TLS Config initialization, so broker can authenticate client. // cc -> tls.Certificate cc, e := tls.LoadX509KeyPair(cliCertFile, cliKeyFile) if e != nil { ll.Fatalf("%stag:%s connsess:%s main_load_pair error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } // Add cert to config tc.Certificates = append(tc.Certificates, cc) // This is OK, but does not seem to be required tc.BuildNameToCertificate() // Build names map // Standard example TLS connect sequence n, conn, e := sngecomm.CommonTLSConnect(exampid, tag, ll, tc) if e != nil { ll.Fatalf("%stag:%s connsess:%s main_on_connect error:%v", exampid, tag, sngecomm.Lcs, e.Error()) // Handle this ...... } nc := n.(*tls.Conn) sngecomm.DumpTLSConfig(exampid, tc, nc) // *NOTE* application specific functionaltiy starts here! // For you to add. // *NOTE* application specific functionaltiy ends here! // Standard example disconnect sequence e = sngecomm.CommonDisconnect(n, conn, exampid, tag, ll) if e != nil { ll.Fatalf("%s %s\n", exampid, e.Error()) // Handle this ...... } ll.Printf("%stag:%s connsess:%s main_elapsed:%v\n", exampid, tag, conn.Session(), time.Now().Sub(st)) }