v5.0.62: utls Chrome-120 TLS fingerprint (DDoS-Guard bypass)

This commit is contained in:
“Naeel”
2026-07-01 14:45:30 +04:00
parent 3c6e8c8b1d
commit 62c41e96d7
5 changed files with 48 additions and 13 deletions
@@ -3,6 +3,7 @@ package provider
import (
"context"
"crypto/tls"
"net"
"net/http"
"os"
"strings"
@@ -17,6 +18,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/types"
utls "github.com/refraction-networking/utls"
)
var _ provider.Provider = &NubesProvider{}
@@ -123,15 +125,29 @@ func (p *NubesProvider) Configure(ctx context.Context, req provider.ConfigureReq
// HTTP transport: клонируем DefaultTransport чтобы сохранить системные настройки (proxy, timeouts).
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.TLSHandshakeTimeout = 60 * time.Second
// Force HTTP/1.1: Nubes API не поддерживает HTTP/2, принудительно отключаем.
// MinVersion TLS 1.2 — минимально безопасная версия TLS.
transport.TLSClientConfig = &tls.Config{
InsecureSkipVerify: insecureSkipVerify, // false в prod, true только для dev
NextProtos: []string{"http/1.1"},
MinVersion: tls.VersionTLS12,
}
transport.ForceAttemptHTTP2 = false
// utls: маскируем Go TLS под Chrome, чтобы пройти DDoS-Guard (JA3 fingerprint).
// Стандартный crypto/tls блокируется на deck-api-*.ngcloud.ru.
transport.DialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
dialer := &net.Dialer{Timeout: 30 * time.Second}
conn, err := dialer.DialContext(ctx, network, addr)
if err != nil {
return nil, err
}
host, _, _ := net.SplitHostPort(addr)
uconn := utls.UClient(conn, &utls.Config{
ServerName: host,
InsecureSkipVerify: insecureSkipVerify,
MinVersion: tls.VersionTLS12,
}, utls.HelloChrome_120)
if err := uconn.HandshakeContext(ctx); err != nil {
conn.Close()
return nil, err
}
return uconn, nil
}
// Определяем уровень логирования операций: none (тихий) / info / debug.
// none — дефолт, не засорять вывод terraform apply лишними строками.
logLevel := "none"