Skip to content

Commit 69c823a

Browse files
committed
enhance: add functions for daemon servers for mTLS
Signed-off-by: Grant Linville <[email protected]>
1 parent 2ddfb8e commit 69c823a

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

pkg/daemon/daemon.go

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package daemon
2+
3+
import (
4+
"crypto/tls"
5+
"crypto/x509"
6+
"encoding/base64"
7+
"fmt"
8+
"net/http"
9+
"os"
10+
)
11+
12+
// CreateServer creates a new HTTP server with TLS configured for GPTScript.
13+
// This function should be used when creating a new server for a daemon tool.
14+
// The server should then be started with the StartServer function.
15+
func CreateServer() (*http.Server, error) {
16+
tlsConfig, err := getTLSConfig()
17+
if err != nil {
18+
return nil, fmt.Errorf("failed to get TLS config: %v\n", err)
19+
}
20+
21+
server := &http.Server{
22+
Addr: fmt.Sprintf("127.0.0.1:%s", os.Getenv("PORT")),
23+
TLSConfig: tlsConfig,
24+
}
25+
return server, nil
26+
}
27+
28+
// StartServer starts an HTTP server created by the CreateServer function.
29+
// This is for use with daemon tools.
30+
func StartServer(server *http.Server) error {
31+
if err := server.ListenAndServeTLS("", ""); err != nil {
32+
return fmt.Errorf("stopped serving: %v\n", err)
33+
}
34+
return nil
35+
}
36+
37+
func getTLSConfig() (*tls.Config, error) {
38+
certB64 := os.Getenv("CERT")
39+
privateKeyB64 := os.Getenv("PRIVATE_KEY")
40+
gptscriptCertB64 := os.Getenv("GPTSCRIPT_CERT")
41+
42+
if certB64 == "" {
43+
return nil, fmt.Errorf("CERT not set")
44+
} else if privateKeyB64 == "" {
45+
return nil, fmt.Errorf("PRIVATE_KEY not set")
46+
} else if gptscriptCertB64 == "" {
47+
return nil, fmt.Errorf("GPTSCRIPT_CERT not set")
48+
}
49+
50+
certBytes, err := base64.StdEncoding.DecodeString(certB64)
51+
if err != nil {
52+
return nil, fmt.Errorf("failed to decode cert base64: %v\n", err)
53+
}
54+
55+
privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyB64)
56+
if err != nil {
57+
return nil, fmt.Errorf("failed to decode private key base64: %v\n", err)
58+
}
59+
60+
gptscriptCertBytes, err := base64.StdEncoding.DecodeString(gptscriptCertB64)
61+
if err != nil {
62+
return nil, fmt.Errorf("failed to decode gptscript cert base64: %v\n", err)
63+
}
64+
65+
cert, err := tls.X509KeyPair(certBytes, privateKeyBytes)
66+
if err != nil {
67+
return nil, fmt.Errorf("failed to create X509 key pair: %v\n", err)
68+
}
69+
70+
pool := x509.NewCertPool()
71+
if !pool.AppendCertsFromPEM(gptscriptCertBytes) {
72+
return nil, fmt.Errorf("failed to append gptscript cert to pool")
73+
}
74+
75+
return &tls.Config{
76+
Certificates: []tls.Certificate{cert},
77+
ClientCAs: pool,
78+
ClientAuth: tls.RequireAndVerifyClientCert,
79+
}, nil
80+
}

0 commit comments

Comments
 (0)