mic.git


mic

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

commit d56c55362c3aef81b05596b5b5afd9240b3bfa9d
parent 29878243c55deec8111b6eb94cc3e913416c3622
Author: djnn <[email protected]>
Date: Wed, 20 Aug 2025 22:46:01 +0900

feat: adding CAPool to Proxy object

Diffstat:
Mcmd/root.go | 13+++++++++++++
Mcmd/types.go | 4++++
Mproxy/proxy.go | 6++++++
Mtest/client/main.go | 1-
Mtest/server/main.go | 1-

5 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/cmd/root.go b/cmd/root.go
@@ -1,6 +1,7 @@
 package cmd
 
 import (
+	"crypto/x509"
 	"fmt"
 	"log"
 	"os"
@@ -56,6 +57,17 @@ func getParser(opts *MicCliOptions) *cobra.Command {
 				ForwardTo:  opts.ForwardTo,
 			}
 
+			if opts.CAPath != "" {
+				caCert, err := os.ReadFile(opts.CAPath)
+				if err != nil {
+					log.Fatalf("Failed to read server certificate: %v", err)
+				}
+
+				caCertPool := x509.NewCertPool()
+				caCertPool.AppendCertsFromPEM(caCert)
+				p.AddCertificate(caCertPool)
+			}
+
 			p.RegisterHandler(proxy.HttpsHandler)
 			p.Run()
 		},
@@ -66,6 +78,7 @@ func getParser(opts *MicCliOptions) *cobra.Command {
 	rootCmd.Flags().StringVarP(&opts.Addr, "addr", "a", defaults.Addr, "address to listen to (Golang notation)")
 	rootCmd.Flags().IntVarP(&opts.ForwardTo, "forward-to", "t", defaults.ForwardTo, "local port to forward to")
 	rootCmd.Flags().BoolVarP(&opts.Verbose, "verbose", "v", defaults.Verbose, "enable verbose mode")
+	rootCmd.Flags().StringVarP(&opts.CAPath, "ca-cert-path", "c", defaults.CAPath, "custom CA certificate path (optional)")
 
 	return rootCmd
 }
diff --git a/cmd/types.go b/cmd/types.go
@@ -10,6 +10,9 @@ type MicCliOptions struct {
 
 	/// Verbose: enable verbose mode
 	Verbose bool
+
+	/// CAPath: Self-signed certificate path (optional)
+	CAPath string
 }
 
 func GetDefaultOptions() MicCliOptions {
@@ -17,6 +20,7 @@ func GetDefaultOptions() MicCliOptions {
 		Addr:      ":8080",
 		ForwardTo: 1337,
 		Verbose:   false,
+		CAPath:    "",
 	}
 
 	return opts
diff --git a/proxy/proxy.go b/proxy/proxy.go
@@ -1,6 +1,7 @@
 package proxy
 
 import (
+	"crypto/x509"
 	"log"
 	"net"
 )
@@ -8,6 +9,7 @@ import (
 type Proxy struct {
 	ListenAddr string
 	ForwardTo  int
+	CAPool     *x509.CertPool
 
 	handlers []Handler
 }
@@ -20,6 +22,10 @@ func (p *Proxy) RegisterHandler(h Handler) {
 	p.handlers = append(p.handlers, h)
 }
 
+func (p *Proxy) AddCertificate(cert *x509.CertPool) {
+	p.CAPool = cert
+}
+
 // Run starts the proxy server and orchestrates all protocol handlers
 func (p *Proxy) Run() error {
 	ln, err := net.Listen("tcp", p.ListenAddr)
diff --git a/test/client/main.go b/test/client/main.go
@@ -49,7 +49,6 @@ func main() {
 		log.Fatalf("uTLS handshake failed: %v", err)
 	}
 
-
 	// 6. Extract and print key details from the server's certificate,
 	// which are used to measure the server's JA4 fingerprint.
 	log.Println("\n--- Server Fingerprint Measurement (JA4-like) ---")
diff --git a/test/server/main.go b/test/server/main.go
@@ -24,4 +24,3 @@ func main() {
 		log.Fatalf("Test server failed: %v", err)
 	}
 }
-