Remove certificate server

This commit is contained in:
9seconds
2019-11-12 16:13:05 +03:00
parent 8e0436e89a
commit 5d3824704c
6 changed files with 8 additions and 152 deletions
-91
View File
@@ -1,91 +0,0 @@
package faketls
import (
"bytes"
"container/ring"
"context"
"crypto/tls"
"errors"
"fmt"
"net"
"strconv"
"time"
"go.uber.org/zap"
"mtg/config"
)
type connectionServer struct {
nextWriteItem *ring.Ring
nextReadItem *ring.Ring
ctx context.Context
channelGet chan chan<- []byte
}
func (c *connectionServer) get() ([]byte, error) {
resp := make(chan []byte)
select {
case <-c.ctx.Done():
return nil, errors.New("context closed")
case c.channelGet <- resp:
return <-resp, nil
}
}
func (c *connectionServer) fetch() ([]byte, error) {
addr := net.JoinHostPort(config.C.CloakHost, strconv.Itoa(config.C.CloakPort))
conn, err := tls.Dial("tcp", addr, &tls.Config{InsecureSkipVerify: true}) // nolint: gosec
if err != nil {
return nil, fmt.Errorf("cannot connect to the masked host: %w", err)
}
defer conn.Close()
if err = conn.Handshake(); err != nil {
return nil, fmt.Errorf("cannot perform tls handshake: %w", err)
}
certificates := conn.ConnectionState().PeerCertificates
if len(certificates) == 0 {
return nil, errors.New("no certificates is found")
}
var buf bytes.Buffer
for _, v := range certificates {
buf.Write(v.Raw)
}
return buf.Bytes(), nil
}
func (c *connectionServer) run(tickEvery time.Duration) {
logger := zap.S().Named("tls-connection-server")
ticker := time.NewTicker(tickEvery)
defer ticker.Stop()
for {
select {
case <-c.ctx.Done():
return
case resp := <-c.channelGet:
resp <- c.nextReadItem.Value.([]byte)
close(resp)
c.nextReadItem = c.nextReadItem.Next()
case <-ticker.C:
cert, err := c.fetch()
switch err {
case nil:
c.nextWriteItem.Value = cert
c.nextWriteItem = c.nextWriteItem.Next()
default:
logger.Warnw("cannot fetch certificates", "error", err)
}
}
}
}
+1 -7
View File
@@ -90,14 +90,8 @@ func (c *ClientProtocol) tlsHandshake(conn io.ReadWriter) error {
}
antireplay.Cache.AddTLS(clientHello.Random[:])
hostCert, err := connectionServerInstance.get()
if err != nil {
return fmt.Errorf("cannot get host certificate: %w", err)
}
serverHello := tlstypes.NewServerHello(clientHello)
serverHelloPacket := serverHello.WelcomePacket(hostCert)
serverHelloPacket := serverHello.WelcomePacket()
if _, err := conn.Write(serverHelloPacket); err != nil {
return fmt.Errorf("cannot send welcome packet: %w", err)
-50
View File
@@ -1,50 +0,0 @@
package faketls
import (
"container/ring"
"context"
"sync"
"time"
"mtg/config"
)
var (
connectionServerInstance connectionServer
connectionServerInitOnce sync.Once
)
const (
connectionServerKeepCertificates = 5
connectionServerUpdateEvery = 10 * time.Minute
)
func Init(ctx context.Context) {
connectionServerInitOnce.Do(func() {
if config.C.CloakHost == "" {
return
}
connectionServerInstance = connectionServer{
channelGet: make(chan chan<- []byte),
ctx: ctx,
}
cert, err := connectionServerInstance.fetch()
if err != nil {
panic(err)
}
r := ring.New(connectionServerKeepCertificates)
for i := 0; i < connectionServerKeepCertificates; i++ {
r.Value = cert
r = r.Next()
}
connectionServerInstance.nextWriteItem = r
connectionServerInstance.nextReadItem = r
go connectionServerInstance.run(connectionServerUpdateEvery)
})
}