refactor: remove unused stream SSL dead code
This commit is contained in:
parent
a919369ca4
commit
a3bc453fbf
@ -1,40 +0,0 @@
|
|||||||
// Package stream 提供 TCP/UDP Stream 代理功能。
|
|
||||||
//
|
|
||||||
// 该文件实现 Stream 模块的 SSL/TLS 支持,包括:
|
|
||||||
// - 服务端 TLS 终端
|
|
||||||
// - 客户端 TLS 连接(上游 SSL)
|
|
||||||
// - 证书加载和配置
|
|
||||||
// - mTLS 客户端证书验证
|
|
||||||
//
|
|
||||||
// 作者:xfy
|
|
||||||
package stream
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
"crypto/x509"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"rua.plus/lolly/internal/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SSLManager 管理 Stream SSL/TLS 配置。
|
|
||||||
//
|
|
||||||
// 负责加载证书、配置 TLS 连接,支持服务端和客户端两种模式。
|
|
||||||
type SSLManager struct {
|
|
||||||
cert tls.Certificate
|
|
||||||
clientCAPool *x509.CertPool
|
|
||||||
config config.StreamSSLConfig
|
|
||||||
mu sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProxySSLManager 管理上游 SSL 连接。
|
|
||||||
//
|
|
||||||
// 负责创建到上游服务器的 TLS 连接,支持证书验证和客户端证书。
|
|
||||||
type ProxySSLManager struct {
|
|
||||||
cert tls.Certificate
|
|
||||||
rootCAPool *x509.CertPool
|
|
||||||
config config.StreamProxySSLConfig
|
|
||||||
mu sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,195 +0,0 @@
|
|||||||
// Package stream 提供 TCP/UDP Stream 代理功能。
|
|
||||||
//
|
|
||||||
// 该文件包含 Stream SSL/TLS 支持的单元测试。
|
|
||||||
//
|
|
||||||
// 作者:xfy
|
|
||||||
package stream
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/rand"
|
|
||||||
"crypto/rsa"
|
|
||||||
"crypto/tls"
|
|
||||||
"crypto/x509"
|
|
||||||
"encoding/pem"
|
|
||||||
"math/big"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"rua.plus/lolly/internal/sslutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
// generateTestCertificate 生成测试用的自签名证书
|
|
||||||
func generateTestCertificate(t *testing.T, certFile, keyFile string) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
// 创建证书模板
|
|
||||||
template := &x509.Certificate{
|
|
||||||
SerialNumber: big.NewInt(1),
|
|
||||||
NotBefore: time.Now(),
|
|
||||||
NotAfter: time.Now().Add(24 * time.Hour),
|
|
||||||
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
|
||||||
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
|
|
||||||
BasicConstraintsValid: true,
|
|
||||||
DNSNames: []string{"localhost"},
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成私钥和证书
|
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to generate key: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
certDER, err := x509.CreateCertificate(rand.Reader, template, template, &key.PublicKey, key)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create certificate: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 写入证书文件
|
|
||||||
certOut, err := os.Create(certFile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create cert file: %v", err)
|
|
||||||
}
|
|
||||||
defer func() { _ = certOut.Close() }()
|
|
||||||
if err := pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: certDER}); err != nil {
|
|
||||||
t.Fatalf("Failed to encode certificate: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 写入私钥文件
|
|
||||||
keyOut, err := os.Create(keyFile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create key file: %v", err)
|
|
||||||
}
|
|
||||||
defer func() { _ = keyOut.Close() }()
|
|
||||||
if err := pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}); err != nil {
|
|
||||||
t.Fatalf("Failed to encode key: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func TestParseMinTLSVersion(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
protocols []string
|
|
||||||
wantVersion uint16
|
|
||||||
}{
|
|
||||||
{[]string{"TLSv1.3"}, tls.VersionTLS13},
|
|
||||||
{[]string{"TLSv1.2"}, tls.VersionTLS12},
|
|
||||||
{[]string{"TLSv1.2", "TLSv1.3"}, tls.VersionTLS12},
|
|
||||||
{[]string{}, tls.VersionTLS12},
|
|
||||||
{[]string{"Unknown"}, tls.VersionTLS12},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := sslutil.ParseMinTLSVersion(tt.protocols)
|
|
||||||
if got != tt.wantVersion {
|
|
||||||
t.Errorf("parseMinTLSVersion(%v) = %v, want %v", tt.protocols, got, tt.wantVersion)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestParseCipherSuites(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
ciphers []string
|
|
||||||
wantLen int
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "valid ciphers",
|
|
||||||
ciphers: []string{"ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-RSA-AES256-GCM-SHA384"},
|
|
||||||
wantLen: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "empty ciphers",
|
|
||||||
ciphers: []string{},
|
|
||||||
wantLen: 0, // returns nil for empty
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "unknown ciphers",
|
|
||||||
ciphers: []string{"UNKNOWN-CIPHER"},
|
|
||||||
wantLen: 0, // returns nil for no valid ciphers
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
got := sslutil.ParseCipherSuitesLenient(tt.ciphers)
|
|
||||||
if tt.wantLen == 0 && got != nil {
|
|
||||||
t.Errorf("Expected nil, got %v", got)
|
|
||||||
} else if tt.wantLen > 0 && len(got) != tt.wantLen {
|
|
||||||
t.Errorf("Expected %d ciphers, got %d", tt.wantLen, len(got))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLoadCertPool(t *testing.T) {
|
|
||||||
t.Run("valid cert", func(t *testing.T) {
|
|
||||||
tempDir := t.TempDir()
|
|
||||||
certFile := filepath.Join(tempDir, "ca.crt")
|
|
||||||
|
|
||||||
// 创建证书
|
|
||||||
template := &x509.Certificate{
|
|
||||||
SerialNumber: big.NewInt(1),
|
|
||||||
NotBefore: time.Now(),
|
|
||||||
NotAfter: time.Now().Add(24 * time.Hour),
|
|
||||||
IsCA: true,
|
|
||||||
KeyUsage: x509.KeyUsageCertSign,
|
|
||||||
}
|
|
||||||
|
|
||||||
key, _ := rsa.GenerateKey(rand.Reader, 2048)
|
|
||||||
certDER, _ := x509.CreateCertificate(rand.Reader, template, template, &key.PublicKey, key)
|
|
||||||
|
|
||||||
certOut, err := os.Create(certFile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create cert file: %v", err)
|
|
||||||
}
|
|
||||||
defer func() { _ = certOut.Close() }()
|
|
||||||
if err := pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: certDER}); err != nil {
|
|
||||||
t.Fatalf("Failed to encode certificate: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
pool, err := sslutil.LoadCertPool(certFile, "test")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("loadCertPool failed: %v", err)
|
|
||||||
}
|
|
||||||
if pool == nil {
|
|
||||||
t.Error("Expected non-nil pool")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("invalid path", func(t *testing.T) {
|
|
||||||
_, err := sslutil.LoadCertPool("/nonexistent/cert.pem", "test")
|
|
||||||
if err == nil {
|
|
||||||
t.Error("Expected error for nonexistent file")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("invalid content", func(t *testing.T) {
|
|
||||||
tempDir := t.TempDir()
|
|
||||||
certFile := filepath.Join(tempDir, "invalid.crt")
|
|
||||||
if err := os.WriteFile(certFile, []byte("not a certificate"), 0o644); err != nil {
|
|
||||||
t.Fatalf("写入无效证书文件失败: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := sslutil.LoadCertPool(certFile, "test")
|
|
||||||
if err == nil {
|
|
||||||
t.Error("Expected error for invalid certificate content")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user