Skip to content

Commit 8eead25

Browse files
committed
tls provider updated, added self signed cert generation. updated new providers. And old database instance id system will be implemented soon
1 parent 068a65f commit 8eead25

File tree

12 files changed

+198
-74
lines changed

12 files changed

+198
-74
lines changed

.DS_Store

0 Bytes
Binary file not shown.

cmd/proxy/internal/core/types.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package core
22

33
import (
4-
"context"
5-
"crypto/tls"
6-
"net"
4+
"context"
5+
"crypto/tls"
6+
"net"
77
)
88

99
// RoutingMetadata contains information extracted from the protocol handshake
@@ -31,4 +31,5 @@ type ProtocolHandler interface {
3131
// It abstracts away the storage mechanism (K8s Secret, File, Vault, etc.).
3232
type TLSProvider interface {
3333
GetCertificate(ctx context.Context) (*tls.Certificate, error)
34+
Store(ctx context.Context, certPEM, keyPEM []byte) error
3435
}

cmd/proxy/internal/discovery/kubernetes/resolver.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package kubernetes
22

33
import (
4-
"context"
5-
"fmt"
6-
"time"
7-
8-
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/core"
9-
corev1 "k8s.io/api/core/v1"
10-
"k8s.io/client-go/informers"
11-
"k8s.io/client-go/kubernetes"
12-
"k8s.io/client-go/tools/cache"
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/core"
9+
corev1 "k8s.io/api/core/v1"
10+
"k8s.io/client-go/informers"
11+
"k8s.io/client-go/kubernetes"
12+
"k8s.io/client-go/tools/cache"
1313
)
1414

1515
type K8sResolver struct {

cmd/proxy/internal/discovery/kubernetes/tls.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package kubernetes
22

33
import (
4-
"context"
5-
"crypto/tls"
6-
"fmt"
4+
"context"
5+
"crypto/tls"
6+
"fmt"
77

8-
corev1 "k8s.io/api/core/v1"
9-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10-
"k8s.io/client-go/kubernetes"
8+
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/client-go/kubernetes"
1111
)
1212

1313
type K8sTLSProvider struct {
14-
clientset *kubernetes.Clientset
15-
namespace string
14+
clientset *kubernetes.Clientset
15+
namespace string
1616
secretName string
1717
}
1818

@@ -46,3 +46,26 @@ func (p *K8sTLSProvider) GetCertificate(ctx context.Context) (*tls.Certificate,
4646

4747
return &cert, nil
4848
}
49+
50+
func (p *K8sTLSProvider) Store(ctx context.Context, certPEM, keyPEM []byte) error {
51+
secret := &corev1.Secret{
52+
ObjectMeta: metav1.ObjectMeta{
53+
Name: p.secretName,
54+
Namespace: p.namespace,
55+
},
56+
Type: corev1.SecretTypeTLS,
57+
Data: map[string][]byte{
58+
corev1.TLSCertKey: certPEM,
59+
corev1.TLSPrivateKeyKey: keyPEM,
60+
},
61+
}
62+
63+
_, err := p.clientset.CoreV1().Secrets(p.namespace).Create(ctx, secret, metav1.CreateOptions{})
64+
if err != nil {
65+
// If it already exists, update it
66+
if _, updateErr := p.clientset.CoreV1().Secrets(p.namespace).Update(ctx, secret, metav1.UpdateOptions{}); updateErr != nil {
67+
return fmt.Errorf("failed to create or update secret %s/%s: %v (create err: %v)", p.namespace, p.secretName, updateErr, err)
68+
}
69+
}
70+
return nil
71+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package memory
2+
3+
import (
4+
"context"
5+
"crypto/tls"
6+
"os"
7+
"sync"
8+
)
9+
10+
// MemoryTLSProvider is a simple in-memory implementation for development
11+
type MemoryTLSProvider struct {
12+
cert *tls.Certificate
13+
mu sync.RWMutex
14+
}
15+
16+
func NewMemoryTLSProvider() *MemoryTLSProvider {
17+
return &MemoryTLSProvider{}
18+
}
19+
20+
func (p *MemoryTLSProvider) GetCertificate(ctx context.Context) (*tls.Certificate, error) {
21+
p.mu.RLock()
22+
defer p.mu.RUnlock()
23+
if p.cert == nil {
24+
return nil, os.ErrNotExist
25+
}
26+
return p.cert, nil
27+
}
28+
29+
func (p *MemoryTLSProvider) Store(ctx context.Context, certPEM, keyPEM []byte) error {
30+
p.mu.Lock()
31+
defer p.mu.Unlock()
32+
cert, err := tls.X509KeyPair(certPEM, keyPEM)
33+
if err != nil {
34+
return err
35+
}
36+
p.cert = &cert
37+
return nil
38+
}

cmd/proxy/internal/storage/filesystem/tls.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package filesystem
22

33
import (
4-
"context"
5-
"crypto/tls"
6-
"fmt"
4+
"context"
5+
"crypto/tls"
6+
"fmt"
7+
"os"
78
)
89

910
type FileTLSProvider struct {
@@ -25,3 +26,13 @@ func (p *FileTLSProvider) GetCertificate(ctx context.Context) (*tls.Certificate,
2526
}
2627
return &cert, nil
2728
}
29+
30+
func (p *FileTLSProvider) Store(ctx context.Context, certPEM, keyPEM []byte) error {
31+
if err := os.WriteFile(p.CertFile, certPEM, 0644); err != nil {
32+
return fmt.Errorf("failed to write cert file: %w", err)
33+
}
34+
if err := os.WriteFile(p.KeyFile, keyPEM, 0600); err != nil {
35+
return fmt.Errorf("failed to write key file: %w", err)
36+
}
37+
return nil
38+
}

cmd/proxy/internal/utils/cert.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package utils
2+
3+
import (
4+
"crypto/rand"
5+
"crypto/rsa"
6+
"crypto/x509"
7+
"crypto/x509/pkix"
8+
"encoding/pem"
9+
"math/big"
10+
"time"
11+
)
12+
13+
// GenerateSelfSignedCert generates a self-signed certificate and private key.
14+
// It returns the PEM-encoded certificate and private key bytes.
15+
func GenerateSelfSignedCert() ([]byte, []byte, error) {
16+
priv, err := rsa.GenerateKey(rand.Reader, 2048)
17+
if err != nil {
18+
return nil, nil, err
19+
}
20+
21+
template := x509.Certificate{
22+
SerialNumber: big.NewInt(1),
23+
Subject: pkix.Name{
24+
Organization: []string{"xdatabase-proxy"},
25+
},
26+
NotBefore: time.Now(),
27+
NotAfter: time.Now().Add(time.Hour * 24 * 365),
28+
29+
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
30+
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
31+
BasicConstraintsValid: true,
32+
}
33+
34+
derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
35+
if err != nil {
36+
return nil, nil, err
37+
}
38+
39+
certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
40+
keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
41+
42+
return certPEM, keyPEM, nil
43+
}

cmd/proxy/main.go

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,18 @@ package main
22

33
import (
44
"context"
5-
"crypto/rand"
6-
"crypto/rsa"
75
"crypto/tls"
8-
"crypto/x509"
9-
"crypto/x509/pkix"
10-
"encoding/pem"
116
"log"
12-
"math/big"
137
"net"
148
"os"
15-
"time"
169

1710
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/api"
1811
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/core"
1912
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/discovery/kubernetes"
2013
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/discovery/memory"
2114
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/protocol/postgresql"
2215
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/storage/filesystem"
16+
"github.com/hasirciogluhq/xdatabase-proxy/cmd/proxy/internal/utils"
2317

2418
k8s "k8s.io/client-go/kubernetes"
2519
"k8s.io/client-go/tools/clientcmd"
@@ -115,13 +109,21 @@ func main() {
115109
log.Printf("Using Kubernetes TLS provider (secret: %s/%s)", namespace, secretName)
116110
tlsProvider = kubernetes.NewK8sTLSProvider(clientset, namespace, secretName)
117111
} else {
118-
// Priority 3: Self-Signed (Development/Default)
119-
log.Println("Using Self-Signed Memory TLS provider (Development Mode)")
120-
cert, err := generateSelfSignedCert()
112+
log.Println("Using Memory TLS provider (Default)")
113+
tlsProvider = memory.NewMemoryTLSProvider()
114+
}
115+
116+
// Check if we should generate and store a self-signed certificate
117+
if os.Getenv("TLS_ENABLE_SELF_SIGNED") == "true" {
118+
log.Println("TLS_ENABLE_SELF_SIGNED is true. Generating and storing self-signed certificate...")
119+
certPEM, keyPEM, err := utils.GenerateSelfSignedCert()
121120
if err != nil {
122121
log.Fatalf("Failed to generate self-signed cert: %v", err)
123122
}
124-
tlsProvider = &memoryTLSProvider{cert: &cert}
123+
124+
if err := tlsProvider.Store(context.Background(), certPEM, keyPEM); err != nil {
125+
log.Fatalf("Failed to store self-signed cert: %v", err)
126+
}
125127
}
126128

127129
// Load initial certificate
@@ -162,42 +164,3 @@ func main() {
162164
log.Fatalf("Server error: %v", err)
163165
}
164166
}
165-
166-
// memoryTLSProvider is a simple in-memory implementation for development
167-
type memoryTLSProvider struct {
168-
cert *tls.Certificate
169-
}
170-
171-
func (p *memoryTLSProvider) GetCertificate(ctx context.Context) (*tls.Certificate, error) {
172-
return p.cert, nil
173-
}
174-
175-
func generateSelfSignedCert() (tls.Certificate, error) {
176-
priv, err := rsa.GenerateKey(rand.Reader, 2048)
177-
if err != nil {
178-
return tls.Certificate{}, err
179-
}
180-
181-
template := x509.Certificate{
182-
SerialNumber: big.NewInt(1),
183-
Subject: pkix.Name{
184-
Organization: []string{"xdatabase-proxy"},
185-
},
186-
NotBefore: time.Now(),
187-
NotAfter: time.Now().Add(time.Hour * 24 * 365),
188-
189-
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
190-
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
191-
BasicConstraintsValid: true,
192-
}
193-
194-
derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
195-
if err != nil {
196-
return tls.Certificate{}, err
197-
}
198-
199-
certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
200-
keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
201-
202-
return tls.X509KeyPair(certPEM, keyPEM)
203-
}

proxy

62.8 MB
Binary file not shown.

run-test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
POSTGRESQL_PROXY_ENABLED=true STATIC_BACKENDS=dblocal=localhost:5432 TLS_CERT_FILE=./tls.cert TLS_KEY_FILE=./tls.key POSTGRESQL_PROXY_START_PORT=7878 go run ./cmd/proxy/main.go
1+
POSTGRESQL_PROXY_ENABLED=true STATIC_BACKENDS=dblocal=localhost:5432 TLS_CERT_FILE=./tls.cert TLS_KEY_FILE=./tls.key POSTGRESQL_PROXY_START_PORT=7878 TLS_ENABLE_SELF_SIGNED=true go run ./cmd/proxy/main.go

0 commit comments

Comments
 (0)