@@ -7,13 +7,22 @@ package main
77
88import (
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
1928const (
@@ -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+
177236func 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