mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-12 22:40:25 +08:00
实现HTTPS配置
This commit is contained in:
@@ -948,12 +948,12 @@ func (this *HTTPRequest) processResponseHeaders(statusCode int) {
|
|||||||
// HSTS
|
// HSTS
|
||||||
if this.IsHTTPS &&
|
if this.IsHTTPS &&
|
||||||
this.Server.HTTPS != nil &&
|
this.Server.HTTPS != nil &&
|
||||||
this.Server.HTTPS.SSL != nil &&
|
this.Server.HTTPS.SSLPolicy != nil &&
|
||||||
this.Server.HTTPS.SSL.IsOn &&
|
this.Server.HTTPS.SSLPolicy.IsOn &&
|
||||||
this.Server.HTTPS.SSL.HSTS != nil &&
|
this.Server.HTTPS.SSLPolicy.HSTS != nil &&
|
||||||
this.Server.HTTPS.SSL.HSTS.IsOn &&
|
this.Server.HTTPS.SSLPolicy.HSTS.IsOn &&
|
||||||
this.Server.HTTPS.SSL.HSTS.Match(this.Host) {
|
this.Server.HTTPS.SSLPolicy.HSTS.Match(this.Host) {
|
||||||
responseHeader.Set(this.Server.HTTPS.SSL.HSTS.HeaderKey(), this.Server.HTTPS.SSL.HSTS.HeaderValue())
|
responseHeader.Set(this.Server.HTTPS.SSLPolicy.HSTS.HeaderKey(), this.Server.HTTPS.SSLPolicy.HSTS.HeaderValue())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,12 +51,12 @@ func (this *Listener) Listen() error {
|
|||||||
switch protocol {
|
switch protocol {
|
||||||
case serverconfigs.ProtocolHTTP, serverconfigs.ProtocolHTTP4, serverconfigs.ProtocolHTTP6:
|
case serverconfigs.ProtocolHTTP, serverconfigs.ProtocolHTTP4, serverconfigs.ProtocolHTTP6:
|
||||||
this.listener = &HTTPListener{
|
this.listener = &HTTPListener{
|
||||||
Group: this.group,
|
BaseListener: BaseListener{Group: this.group},
|
||||||
Listener: netListener,
|
Listener: netListener,
|
||||||
}
|
}
|
||||||
case serverconfigs.ProtocolHTTPS, serverconfigs.ProtocolHTTPS4, serverconfigs.ProtocolHTTPS6:
|
case serverconfigs.ProtocolHTTPS, serverconfigs.ProtocolHTTPS4, serverconfigs.ProtocolHTTPS6:
|
||||||
this.listener = &HTTPListener{
|
this.listener = &HTTPListener{
|
||||||
Group: this.group,
|
BaseListener: BaseListener{Group: this.group},
|
||||||
Listener: netListener,
|
Listener: netListener,
|
||||||
}
|
}
|
||||||
case serverconfigs.ProtocolTCP, serverconfigs.ProtocolTCP4, serverconfigs.ProtocolTCP6:
|
case serverconfigs.ProtocolTCP, serverconfigs.ProtocolTCP4, serverconfigs.ProtocolTCP6:
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ type BaseListener struct {
|
|||||||
serversLocker sync.RWMutex
|
serversLocker sync.RWMutex
|
||||||
namedServersLocker sync.RWMutex
|
namedServersLocker sync.RWMutex
|
||||||
namedServers map[string]*NamedServer // 域名 => server
|
namedServers map[string]*NamedServer // 域名 => server
|
||||||
|
|
||||||
|
Group *serverconfigs.ServerGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
@@ -28,22 +30,22 @@ func (this *BaseListener) Reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 构造TLS配置
|
// 构造TLS配置
|
||||||
func (this *BaseListener) buildTLSConfig(group *serverconfigs.ServerGroup) *tls.Config {
|
func (this *BaseListener) buildTLSConfig() *tls.Config {
|
||||||
return &tls.Config{
|
return &tls.Config{
|
||||||
Certificates: nil,
|
Certificates: nil,
|
||||||
GetConfigForClient: func(info *tls.ClientHelloInfo) (config *tls.Config, e error) {
|
GetConfigForClient: func(info *tls.ClientHelloInfo) (config *tls.Config, e error) {
|
||||||
ssl, _, err := this.matchSSL(group, info.ServerName)
|
ssl, _, err := this.matchSSL(info.ServerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
cipherSuites := ssl.TLSCipherSuites()
|
cipherSuites := ssl.TLSCipherSuites()
|
||||||
if len(cipherSuites) == 0 {
|
if !ssl.CipherSuitesIsOn || len(cipherSuites) == 0 {
|
||||||
cipherSuites = nil
|
cipherSuites = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
nextProto := []string{}
|
nextProto := []string{}
|
||||||
if !ssl.HTTP2Disabled {
|
if ssl.HTTP2Enabled {
|
||||||
nextProto = []string{http2.NextProtoTLS}
|
nextProto = []string{http2.NextProtoTLS}
|
||||||
}
|
}
|
||||||
return &tls.Config{
|
return &tls.Config{
|
||||||
@@ -51,7 +53,7 @@ func (this *BaseListener) buildTLSConfig(group *serverconfigs.ServerGroup) *tls.
|
|||||||
MinVersion: ssl.TLSMinVersion(),
|
MinVersion: ssl.TLSMinVersion(),
|
||||||
CipherSuites: cipherSuites,
|
CipherSuites: cipherSuites,
|
||||||
GetCertificate: func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, e error) {
|
GetCertificate: func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, e error) {
|
||||||
_, cert, err := this.matchSSL(group, info.ServerName)
|
_, cert, err := this.matchSSL(info.ServerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -67,7 +69,7 @@ func (this *BaseListener) buildTLSConfig(group *serverconfigs.ServerGroup) *tls.
|
|||||||
}, nil
|
}, nil
|
||||||
},
|
},
|
||||||
GetCertificate: func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, e error) {
|
GetCertificate: func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, e error) {
|
||||||
_, cert, err := this.matchSSL(group, info.ServerName)
|
_, cert, err := this.matchSSL(info.ServerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -80,10 +82,12 @@ func (this *BaseListener) buildTLSConfig(group *serverconfigs.ServerGroup) *tls.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据域名匹配证书
|
// 根据域名匹配证书
|
||||||
func (this *BaseListener) matchSSL(group *serverconfigs.ServerGroup, domain string) (*sslconfigs.SSLConfig, *tls.Certificate, error) {
|
func (this *BaseListener) matchSSL(domain string) (*sslconfigs.SSLPolicy, *tls.Certificate, error) {
|
||||||
this.serversLocker.RLock()
|
this.serversLocker.RLock()
|
||||||
defer this.serversLocker.RUnlock()
|
defer this.serversLocker.RUnlock()
|
||||||
|
|
||||||
|
group := this.Group
|
||||||
|
|
||||||
// 如果域名为空,则取第一个
|
// 如果域名为空,则取第一个
|
||||||
// 通常域名为空是因为是直接通过IP访问的
|
// 通常域名为空是因为是直接通过IP访问的
|
||||||
if len(domain) == 0 {
|
if len(domain) == 0 {
|
||||||
@@ -95,7 +99,7 @@ func (this *BaseListener) matchSSL(group *serverconfigs.ServerGroup, domain stri
|
|||||||
if firstServer == nil {
|
if firstServer == nil {
|
||||||
return nil, nil, errors.New("no server available")
|
return nil, nil, errors.New("no server available")
|
||||||
}
|
}
|
||||||
sslConfig := firstServer.SSLConfig()
|
sslConfig := firstServer.SSLPolicy()
|
||||||
|
|
||||||
if sslConfig != nil {
|
if sslConfig != nil {
|
||||||
return sslConfig, sslConfig.FirstCert(), nil
|
return sslConfig, sslConfig.FirstCert(), nil
|
||||||
@@ -106,15 +110,15 @@ func (this *BaseListener) matchSSL(group *serverconfigs.ServerGroup, domain stri
|
|||||||
|
|
||||||
// 通过代理服务域名配置匹配
|
// 通过代理服务域名配置匹配
|
||||||
server, _ := this.findNamedServer(group, domain)
|
server, _ := this.findNamedServer(group, domain)
|
||||||
if server == nil || server.SSLConfig() == nil || !server.SSLConfig().IsOn {
|
if server == nil || server.SSLPolicy() == nil || !server.SSLPolicy().IsOn {
|
||||||
// 搜索所有的Server,通过SSL证书内容中的DNSName匹配
|
// 搜索所有的Server,通过SSL证书内容中的DNSName匹配
|
||||||
for _, server := range group.Servers {
|
for _, server := range group.Servers {
|
||||||
if server.SSLConfig() == nil || !server.SSLConfig().IsOn {
|
if server.SSLPolicy() == nil || !server.SSLPolicy().IsOn {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
cert, ok := server.SSLConfig().MatchDomain(domain)
|
cert, ok := server.SSLPolicy().MatchDomain(domain)
|
||||||
if ok {
|
if ok {
|
||||||
return server.SSLConfig(), cert, nil
|
return server.SSLPolicy(), cert, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +126,7 @@ func (this *BaseListener) matchSSL(group *serverconfigs.ServerGroup, domain stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 证书是否匹配
|
// 证书是否匹配
|
||||||
sslConfig := server.SSLConfig()
|
sslConfig := server.SSLPolicy()
|
||||||
cert, ok := sslConfig.MatchDomain(domain)
|
cert, ok := sslConfig.MatchDomain(domain)
|
||||||
if ok {
|
if ok {
|
||||||
return sslConfig, cert, nil
|
return sslConfig, cert, nil
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import (
|
|||||||
type HTTPListener struct {
|
type HTTPListener struct {
|
||||||
BaseListener
|
BaseListener
|
||||||
|
|
||||||
Group *serverconfigs.ServerGroup
|
|
||||||
Listener net.Listener
|
Listener net.Listener
|
||||||
|
|
||||||
addr string
|
addr string
|
||||||
@@ -49,7 +48,7 @@ func (this *HTTPListener) Serve() error {
|
|||||||
|
|
||||||
// HTTPS协议
|
// HTTPS协议
|
||||||
if this.isHTTPS {
|
if this.isHTTPS {
|
||||||
this.httpServer.TLSConfig = this.buildTLSConfig(this.Group)
|
this.httpServer.TLSConfig = this.buildTLSConfig()
|
||||||
|
|
||||||
// support http/2
|
// support http/2
|
||||||
err := http2.ConfigureServer(this.httpServer, nil)
|
err := http2.ConfigureServer(this.httpServer, nil)
|
||||||
@@ -76,10 +75,6 @@ func (this *HTTPListener) Close() error {
|
|||||||
func (this *HTTPListener) Reload(group *serverconfigs.ServerGroup) {
|
func (this *HTTPListener) Reload(group *serverconfigs.ServerGroup) {
|
||||||
this.Group = group
|
this.Group = group
|
||||||
|
|
||||||
if this.isHTTPS {
|
|
||||||
this.httpServer.TLSConfig = this.buildTLSConfig(this.Group)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Reset()
|
this.Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user