mic.git


mic

~ proxy for JA4-TLS fingerprinting evasion
git clone https://github.com/djnnvx/mic.git
log | files | refs | archive | README | LICENSE

server.go (1856B)

      1 package cmd
      2 
      3 import (
      4 	"errors"
      5 	"fmt"
      6 	"log"
      7 
      8 	"github.com/djnnvx/mic/fingerprint"
      9 	"github.com/djnnvx/mic/proxy"
     10 	"github.com/spf13/cobra"
     11 )
     12 
     13 func newServerCmd() *cobra.Command {
     14 	var (
     15 		listen  string
     16 		backend string
     17 		fpName  string
     18 		caPath  string
     19 		cert    string
     20 		key     string
     21 	)
     22 
     23 	cmd := &cobra.Command{
     24 		Use:   "server",
     25 		Short: "TLS termination proxy with upstream fingerprinting",
     26 		RunE: func(cmd *cobra.Command, args []string) error {
     27 			if backend == "" {
     28 				return errors.New("--backend is required for server mode")
     29 			}
     30 			if cert == "" || key == "" {
     31 				return errors.New("--cert and --key are required for server mode")
     32 			}
     33 
     34 			p := &proxy.Proxy{
     35 				ListenAddr:  listen,
     36 				BackendAddr: backend,
     37 			}
     38 
     39 			if caPath != "" {
     40 				pool, err := loadCAPool(caPath)
     41 				if err != nil {
     42 					return err
     43 				}
     44 				p.CAPool = pool
     45 			}
     46 
     47 			if fpName != "" {
     48 				fp, err := fingerprint.ByName(fpName)
     49 				if err != nil {
     50 					return fmt.Errorf("loading fingerprint: %w", err)
     51 				}
     52 				p.Fingerprint = fp
     53 				log.Printf("[+] Using TLS fingerprint: %s", fp.Name())
     54 			}
     55 
     56 			handler, err := proxy.ServerFrontHandler(cert, key)
     57 			if err != nil {
     58 				return err
     59 			}
     60 			p.Handler = handler
     61 
     62 			log.Printf("[+] Mode: server (TLS termination → backend %s)", backend)
     63 			return p.Run()
     64 		},
     65 	}
     66 
     67 	cmd.Flags().StringVarP(&listen, "listen", "l", ":8080", "listen address")
     68 	cmd.Flags().StringVarP(&backend, "backend", "b", "", "backend host:port (required)")
     69 	cmd.Flags().StringVarP(&fpName, "fingerprint", "f", "", "TLS fingerprint profile name (e.g. chrome-120)")
     70 	cmd.Flags().StringVar(&caPath, "ca", "", "path to upstream CA certificate")
     71 	cmd.Flags().StringVar(&cert, "cert", "", "TLS certificate for incoming termination (required)")
     72 	cmd.Flags().StringVar(&key, "key", "", "TLS key for incoming termination (required)")
     73 
     74 	return cmd
     75 }