添加tls_cipherSuites 配置和 tls_maxVersion 这两个extra配置

This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent f34c945992
commit c45045aa8a
6 changed files with 235 additions and 51 deletions

View File

@@ -375,14 +375,15 @@ func (b *Base) InitAdvLayer() {
KeyFile: dc.TLSKey,
}
}
minVer := tlsLayer.GetMinVerFromExtra(dc.Extra)
tConf = tlsLayer.GetTlsConfig(false, tlsLayer.Conf{
Insecure: dc.Insecure,
AlpnList: dc.Alpn,
Host: dc.Host,
CertConf: certConf,
Minver: minVer,
Insecure: dc.Insecure,
AlpnList: dc.Alpn,
Host: dc.Host,
CertConf: certConf,
Minver: getTlsMinVerFromExtra(dc.Extra),
Maxver: getTlsMaxVerFromExtra(dc.Extra),
CipherSuites: getTlsCipherSuitesFromExtra(dc.Extra),
})
}
@@ -434,8 +435,6 @@ func (b *Base) InitAdvLayer() {
if creator.IsSuper() {
minVer := tlsLayer.GetMinVerFromExtra(lc.Extra)
aConf.TlsConf = tlsLayer.GetTlsConfig(true, tlsLayer.Conf{
Insecure: lc.Insecure,
AlpnList: lc.Alpn,
@@ -443,7 +442,9 @@ func (b *Base) InitAdvLayer() {
CertConf: &tlsLayer.CertConf{
CertFile: lc.TLSCert, KeyFile: lc.TLSKey, CA: lc.CA,
},
Minver: minVer,
Minver: getTlsMinVerFromExtra(lc.Extra),
Maxver: getTlsMaxVerFromExtra(lc.Extra),
CipherSuites: getTlsCipherSuitesFromExtra(lc.Extra),
})
}

View File

@@ -1,8 +1,11 @@
package proxy
import (
"crypto/tls"
"github.com/e1732a364fed/v2ray_simple/advLayer"
"github.com/e1732a364fed/v2ray_simple/tlsLayer"
"github.com/e1732a364fed/v2ray_simple/utils"
)
func updateAlpnListByAdvLayer(com BaseInterface, alpnList []string) (result []string) {
@@ -59,15 +62,16 @@ func prepareTLS_forClient(com BaseInterface, dc *DialConf) error {
KeyFile: dc.TLSKey,
}
}
var minVer uint16 = tlsLayer.GetMinVerFromExtra(dc.Extra)
clic.Tls_c = tlsLayer.NewClient(tlsLayer.Conf{
Host: dc.Host,
Insecure: dc.Insecure,
Use_uTls: dc.Utls,
AlpnList: alpnList,
CertConf: certConf,
Minver: minVer,
Host: dc.Host,
Insecure: dc.Insecure,
Use_uTls: dc.Utls,
AlpnList: alpnList,
CertConf: certConf,
Minver: getTlsMinVerFromExtra(dc.Extra),
Maxver: getTlsMaxVerFromExtra(dc.Extra),
CipherSuites: getTlsCipherSuitesFromExtra(dc.Extra),
})
return nil
}
@@ -87,10 +91,13 @@ func prepareTLS_forServer(com BaseInterface, lc *ListenConf) error {
CertConf: &tlsLayer.CertConf{
CertFile: lc.TLSCert, KeyFile: lc.TLSKey, CA: lc.CA,
},
Insecure: lc.Insecure,
AlpnList: alpnList,
Minver: tlsLayer.GetMinVerFromExtra(lc.Extra),
RejectUnknownSni: tlsLayer.GetRejectUnknownSniFromExtra(lc.Extra),
Insecure: lc.Insecure,
AlpnList: alpnList,
Minver: getTlsMinVerFromExtra(lc.Extra),
Maxver: getTlsMaxVerFromExtra(lc.Extra),
RejectUnknownSni: getTlsRejectUnknownSniFromExtra(lc.Extra),
CipherSuites: getTlsCipherSuitesFromExtra(lc.Extra),
})
if err == nil {
@@ -100,3 +107,69 @@ func prepareTLS_forServer(com BaseInterface, lc *ListenConf) error {
}
return nil
}
func getTlsMinVerFromExtra(extra map[string]any) uint16 {
if len(extra) > 0 {
if thing := extra["tls_minVersion"]; thing != nil {
if str, ok := (thing).(string); ok && len(str) > 0 {
switch str {
case "1.2":
return tls.VersionTLS12
}
}
}
}
return tls.VersionTLS13
}
func getTlsMaxVerFromExtra(extra map[string]any) uint16 {
if len(extra) > 0 {
if thing := extra["tls_maxVersion"]; thing != nil {
if str, ok := (thing).(string); ok && len(str) > 0 {
switch str {
case "1.2":
return tls.VersionTLS12
}
}
}
}
return tls.VersionTLS13
}
func getTlsRejectUnknownSniFromExtra(extra map[string]any) bool {
if len(extra) > 0 {
if thing := extra["tls_rejectUnknownSni"]; thing != nil {
if is, ok := utils.AnyToBool(thing); ok && is {
return true
}
}
}
return false
}
func getTlsCipherSuitesFromExtra(extra map[string]any) []uint16 {
if len(extra) > 0 {
if thing := extra["tls_cipherSuites"]; thing != nil {
if is, ok := utils.AnyToUInt16Array(thing); ok && len(is) > 0 {
return is
}
if strs, ok := thing.([]string); ok {
var v []uint16
for _, s := range strs {
cs := tlsLayer.StrToCipherSuite(s)
if cs > 0 {
v = append(v, cs)
}
}
if len(v) > 0 {
return v
}
}
}
}
return nil
}

View File

@@ -2,7 +2,6 @@ package tlsLayer
import (
"errors"
"io/ioutil"
mathrand "math/rand"
"crypto/ecdsa"
@@ -34,7 +33,7 @@ func LoadCA(caFile string) (cp *x509.CertPool, err error) {
return
}
cp = x509.NewCertPool()
data, err := ioutil.ReadFile(caFile)
data, err := os.ReadFile(caFile)
if err != nil {
return nil, err
}
@@ -44,7 +43,7 @@ func LoadCA(caFile string) (cp *x509.CertPool, err error) {
return
}
//使用 ecc p256 方式生成证书
// 使用 ecc p256 方式生成证书
func GenerateRandomeCert_Key() (certPEM []byte, keyPEM []byte) {
//可参考 https://blog.ideawand.com/2017/11/22/build-certificate-that-support-Subject-Alternative-Name-SAN/
@@ -143,7 +142,7 @@ func GenerateRandomCertKeyFiles(cfn, kfn string) error {
return nil
}
//若 certFile, keyFile 有一项没给出,则会自动生成随机证书
// 若 certFile, keyFile 有一项没给出,则会自动生成随机证书
func GetCertArrayFromFile(certFile, keyFile string) (certArray []tls.Certificate, err error) {
if certFile != "" && keyFile != "" {
cert, err := tls.LoadX509KeyPair(utils.GetFilePath(certFile), utils.GetFilePath(keyFile))

View File

@@ -19,38 +19,13 @@ type Conf struct {
Host string
Insecure bool
Minver uint16
Maxver uint16
AlpnList []string
CertConf *CertConf
Use_uTls bool //only client
RejectUnknownSni bool //only server
}
func GetMinVerFromExtra(extra map[string]any) uint16 {
if len(extra) > 0 {
if thing := extra["tls_minVersion"]; thing != nil {
if str, ok := (thing).(string); ok && len(str) > 0 {
switch str {
case "1.2":
return tls.VersionTLS12
}
}
}
}
return tls.VersionTLS13
}
func GetRejectUnknownSniFromExtra(extra map[string]any) bool {
if len(extra) > 0 {
if thing := extra["rejectUnknownSni"]; thing != nil {
if is, ok := utils.AnyToBool(thing); ok && is {
return true
}
}
}
return false
CipherSuites []uint16
}
func rejectUnknownGetCertificateFunc(certs []*tls.Certificate) func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) {
@@ -110,6 +85,8 @@ func GetTlsConfig(mustHasCert bool, conf Conf) *tls.Config {
ServerName: conf.Host,
Certificates: certArray,
MinVersion: conf.Minver,
MaxVersion: conf.Maxver,
CipherSuites: conf.CipherSuites,
}
if conf.CertConf != nil && conf.CertConf.CA != "" {
certPool, err := LoadCA(conf.CertConf.CA)
@@ -156,6 +133,8 @@ func GetUTlsConfig(conf Conf) utls.Config {
ServerName: conf.Host,
Certificates: certArray,
MinVersion: conf.Minver,
MaxVersion: conf.Maxver,
CipherSuites: conf.CipherSuites,
}
if conf.CertConf != nil && conf.CertConf.CA != "" {
certPool, err := LoadCA(conf.CertConf.CA)

69
tlsLayer/utils.go Normal file
View File

@@ -0,0 +1,69 @@
package tlsLayer
import (
"crypto/tls"
"strings"
)
// 0 means illegal string
func StrToCipherSuite(str string) uint16 {
str = strings.ToUpper(str)
//tls1.2
switch str {
case "TLS_RSA_WITH_RC4_128_SHA":
return tls.TLS_RSA_WITH_RC4_128_SHA
case "TLS_RSA_WITH_3DES_EDE_CBC_SHA":
return tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA
case "TLS_RSA_WITH_AES_128_CBC_SHA":
return tls.TLS_RSA_WITH_AES_128_CBC_SHA
case "TLS_RSA_WITH_AES_256_CBC_SHA":
return tls.TLS_RSA_WITH_AES_256_CBC_SHA
case "TLS_RSA_WITH_AES_128_CBC_SHA256":
return tls.TLS_RSA_WITH_AES_128_CBC_SHA256
case "TLS_RSA_WITH_AES_128_GCM_SHA256":
return tls.TLS_RSA_WITH_AES_128_GCM_SHA256
case "TLS_RSA_WITH_AES_256_GCM_SHA384":
return tls.TLS_RSA_WITH_AES_256_GCM_SHA384
case "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":
return tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
case "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":
return tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
case "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":
return tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
case "TLS_ECDHE_RSA_WITH_RC4_128_SHA":
return tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA
case "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":
return tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
case "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":
return tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
case "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":
return tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
case "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256":
return tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
case "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":
return tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
case "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":
return tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
case "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256":
return tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
case "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":
return tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
case "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384":
return tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
case "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256":
return tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
case "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256":
return tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
//tls1.3
case "TLS_AES_128_GCM_SHA256":
return tls.TLS_AES_128_GCM_SHA256
case "TLS_AES_256_GCM_SHA384":
return tls.TLS_AES_256_GCM_SHA384
case "TLS_CHACHA20_POLY1305_SHA256":
return tls.TLS_CHACHA20_POLY1305_SHA256
}
return 0
}

View File

@@ -136,3 +136,66 @@ func AnyToFloat64(a any) (float64, bool) {
}
return 0, false
}
func AnyToUInt16Array(a any) ([]uint16, bool) {
switch value := a.(type) {
case []uint16:
return value, true
case []uint32:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []uint64:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []uint8:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []uint:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []int:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []int8:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []int16:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []int32:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
case []int64:
var vv []uint16
for _, v := range value {
vv = append(vv, uint16(v))
}
return vv, true
}
return nil, false
}