Skip to content

Commit 27625e1

Browse files
committed
examples: add TLS support to basic price oracle service
This commit adds basic TLS support to the example price oracle service. When connecting to the RPC price oracle, Tapd now assumes TLS. TLS certificate authentication is skipped by Tapd.
1 parent c5a4b7a commit 27625e1

File tree

1 file changed

+79
-6
lines changed
  • docs/examples/basic-price-oracle

1 file changed

+79
-6
lines changed

docs/examples/basic-price-oracle/main.go

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,22 @@ package main
77

88
import (
99
"context"
10+
"crypto/ecdsa"
11+
"crypto/elliptic"
12+
"crypto/rand"
13+
"crypto/tls"
14+
"crypto/x509"
15+
"crypto/x509/pkix"
16+
"encoding/pem"
1017
"fmt"
18+
"log"
19+
"math/big"
1120
"net"
1221
"time"
1322

1423
oraclerpc "github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
1524
"google.golang.org/grpc"
16-
"google.golang.org/grpc/credentials/insecure"
25+
"google.golang.org/grpc/credentials"
1726
)
1827

1928
const (
@@ -174,12 +183,76 @@ func startService(grpcServer *grpc.Server) error {
174183
return grpcServer.Serve(grpcListener)
175184
}
176185

186+
// Generate a self-signed TLS certificate and private key.
187+
func generateSelfSignedCert() (tls.Certificate, error) {
188+
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
189+
if err != nil {
190+
return tls.Certificate{}, err
191+
}
192+
193+
keyUsage := x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature
194+
extKeyUsage := []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}
195+
template := x509.Certificate{
196+
SerialNumber: big.NewInt(1),
197+
Subject: pkix.Name{
198+
Organization: []string{"basic-price-oracle"},
199+
},
200+
NotBefore: time.Now(),
201+
NotAfter: time.Now().Add(24 * time.Hour), // Valid for 1 day
202+
203+
KeyUsage: keyUsage,
204+
ExtKeyUsage: extKeyUsage,
205+
BasicConstraintsValid: true,
206+
}
207+
208+
certDER, err := x509.CreateCertificate(
209+
rand.Reader, &template, &template, &privateKey.PublicKey,
210+
privateKey,
211+
)
212+
if err != nil {
213+
return tls.Certificate{}, err
214+
}
215+
216+
privateKeyBits, err := x509.MarshalECPrivateKey(privateKey)
217+
if err != nil {
218+
return tls.Certificate{}, err
219+
}
220+
221+
certPEM := pem.EncodeToMemory(
222+
&pem.Block{Type: "CERTIFICATE", Bytes: certDER},
223+
)
224+
keyPEM := pem.EncodeToMemory(
225+
&pem.Block{Type: "EC PRIVATE KEY", Bytes: privateKeyBits},
226+
)
227+
228+
tlsCert, err := tls.X509KeyPair(certPEM, keyPEM)
229+
if err != nil {
230+
return tls.Certificate{}, err
231+
}
232+
233+
return tlsCert, nil
234+
}
235+
177236
func main() {
178237
// Start the mock RPC price oracle service.
179-
serverOpts := []grpc.ServerOption{
180-
grpc.Creds(insecure.NewCredentials()),
238+
//
239+
// Generate self-signed certificate. This allows us to use TLS for the
240+
// gRPC server.
241+
tlsCert, err := generateSelfSignedCert()
242+
if err != nil {
243+
log.Fatalf("Failed to generate TLS certificate: %v", err)
244+
}
245+
246+
// Create the gRPC server with TLS
247+
transportCredentials := credentials.NewTLS(&tls.Config{
248+
Certificates: []tls.Certificate{tlsCert},
249+
})
250+
backendService := grpc.NewServer(grpc.Creds(transportCredentials))
251+
252+
err = startService(backendService)
253+
if err != nil {
254+
log.Fatalf("Start service error: %v", err)
181255
}
182-
backendService := grpc.NewServer(serverOpts...)
183-
_ = startService(backendService)
184-
backendService.Stop()
256+
257+
backendService.GracefulStop()
185258
}

0 commit comments

Comments
 (0)