Skip to content

Commit ac8bf7d

Browse files
Surya Ahujameta-codesync[bot]
authored andcommitted
Add tls params to client and server
Reviewed By: shringiarpit26 Differential Revision: D82873726 fbshipit-source-id: ae0878dcef374107947efb0928691ed5e0c67513
1 parent e12ef60 commit ac8bf7d

File tree

6 files changed

+687
-13
lines changed

6 files changed

+687
-13
lines changed

cmds/client/main.go

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,48 @@ var (
2828
remAddr = flag.String("rem-addr", "", "the remote address the client is coming from.")
2929
secret = flag.String("secret", "fooman", "the tacacs secret to be used.")
3030
authenMode = flag.String("authen-mode", "pap", "valid choices, [pap ascii]")
31+
32+
// TLS options
33+
useTLS = flag.Bool("tls", false, "enable TLS support as per IETF draft-ietf-opsawg-tacacs-tls13-07")
34+
tlsCertFile = flag.String("tls-cert", "", "path to TLS client certificate file")
35+
tlsKeyFile = flag.String("tls-key", "", "path to TLS client key file")
36+
tlsCAFile = flag.String("tls-ca", "", "path to TLS CA certificate file for server certificate validation")
37+
tlsServerName = flag.String("tls-server-name", "", "server name for TLS certificate validation")
38+
tlsInsecureSkipVerify = flag.Bool("tls-insecure-skip-verify", false, "skip TLS certificate verification (not recommended for production)")
3139
)
3240

3341
func main() {
3442
flag.Parse()
3543
verifyFlags()
3644

37-
c, err := tq.NewClient(tq.SetClientDialer(*network, *address, []byte(*secret)))
38-
if err != nil {
39-
fmt.Printf("%v\n", err)
40-
os.Exit(1)
45+
var c *tq.Client
46+
var err error
47+
48+
if *useTLS {
49+
// Create TLS configuration
50+
tlsConfig, tlsErr := tq.GenClientTLSConfig(*tlsServerName, *tlsCertFile, *tlsKeyFile, *tlsCAFile, *tlsInsecureSkipVerify)
51+
if tlsErr != nil {
52+
fmt.Printf("Error creating TLS config: %v\n", tlsErr)
53+
os.Exit(1)
54+
}
55+
56+
// Create client with TLS support
57+
c, err = tq.NewClient(tq.SetClientTLSDialer(*network, *address, tlsConfig))
58+
if err != nil {
59+
fmt.Printf("Error creating TLS client: %v\n", err)
60+
os.Exit(1)
61+
}
62+
fmt.Println("Connected to server using TLS")
63+
} else {
64+
// Create standard client
65+
c, err = tq.NewClient(tq.SetClientDialer(*network, *address, []byte(*secret)))
66+
if err != nil {
67+
fmt.Printf("%v\n", err)
68+
os.Exit(1)
69+
}
4170
}
4271
defer c.Close()
72+
4373
switch *authenMode {
4474
case "pap":
4575
pap(c)

cmds/server/main.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package main
99

1010
import (
1111
"context"
12-
1312
"flag"
1413
"net"
1514
"os"
@@ -38,6 +37,13 @@ var (
3837
configPath = flag.String("config", "tacquito.yaml", "the string path representing the storage location of the server config")
3938
accountingLogPath = flag.String("acct-log-path", "/tmp/tacquito_accounting.log", "the string path representing the storage location of the server accounting logs")
4039
level = flag.Int("level", 30, "log levels; 10 = error, 20 = info, 30 = debug")
40+
41+
// TLS options
42+
useTLS = flag.Bool("tls", false, "enable TLS support as per IETF draft-ietf-opsawg-tacacs-tls13-07")
43+
tlsCertFile = flag.String("tls-cert", "", "path to TLS certificate file")
44+
tlsKeyFile = flag.String("tls-key", "", "path to TLS key file")
45+
tlsCAFile = flag.String("tls-ca", "", "path to TLS CA certificate file for client certificate validation")
46+
tlsRequireClientCert = flag.Bool("tls-require-client-cert", false, "require client certificates for TLS connections")
4147
)
4248

4349
func main() {
@@ -84,21 +90,43 @@ func main() {
8490
}
8591

8692
// setup our listener
93+
var tqListener tq.DeadlineListener
94+
8795
listener, err := net.Listen(*network, *address)
8896
if err != nil {
8997
logger.Fatalf(ctx, "error reading address: %v", err)
9098
return
9199
}
92100

93-
tcpListener, ok := listener.(*net.TCPListener)
94-
if !ok {
95-
logger.Fatalf(ctx, "listener must be a tcp based listener")
96-
return
101+
// Create server with options
102+
serverOpts := []tq.Option{tq.SetUseProxy(*proxy)}
103+
104+
if *useTLS {
105+
// If TLS is enabled but no certificate/key files are provided, log error an exit
106+
config, err := tq.GenTLSConfig(*tlsCertFile, *tlsKeyFile, *tlsCAFile, *tlsRequireClientCert)
107+
if err != nil {
108+
logger.Errorf(ctx, "error generating tls config: %v", err)
109+
return
110+
}
111+
tlsListen, err := tq.NewTLSListener(listener, config)
112+
if err != nil {
113+
logger.Errorf(ctx, "error creating tls listener: %v", err)
114+
return
115+
}
116+
tqListener = tlsListen
117+
serverOpts = append(serverOpts, tq.SetUseTLS(true))
118+
} else {
119+
tcpListener, ok := listener.(*net.TCPListener)
120+
if !ok {
121+
logger.Errorf(ctx, "listener must be a tcp based listener")
122+
return
123+
}
124+
tqListener = tcpListener
125+
logger.Infof(ctx, "serve on %v", tcpListener.Addr().String())
97126
}
98-
logger.Infof(ctx, "serve on %v", tcpListener.Addr().String())
99127

100-
s := tq.NewServer(logger, sp, tq.SetUseProxy(*proxy))
101-
if err := s.Serve(ctx, tcpListener); err != nil {
128+
s := tq.NewServer(logger, sp, serverOpts...)
129+
if err := s.Serve(ctx, tqListener); err != nil {
102130
logger.Errorf(ctx, "error listening: %v", err)
103131
return
104132
}

0 commit comments

Comments
 (0)