对https与websocket支持多证书

This commit is contained in:
boyce
2019-04-11 10:19:16 +08:00
parent 1d607d9018
commit 3222f26d7e
3 changed files with 60 additions and 14 deletions

View File

@@ -323,7 +323,6 @@ func (slf *CCluster) Go(bCast bool, NodeServiceMethod string, args interface{},
if replyCall.Error != nil { if replyCall.Error != nil {
service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.Go(%s) fail:%v.", NodeServiceMethod, replyCall.Error) service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.Go(%s) fail:%v.", NodeServiceMethod, replyCall.Error)
} }
return replyCall.Error
} else { } else {
pclient := slf.GetClusterClient(nodeid) pclient := slf.GetClusterClient(nodeid)
if pclient == nil { if pclient == nil {
@@ -334,7 +333,6 @@ func (slf *CCluster) Go(bCast bool, NodeServiceMethod string, args interface{},
if replyCall.Error != nil { if replyCall.Error != nil {
service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.Go(%s) fail:%v.", NodeServiceMethod, replyCall.Error) service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.Go(%s) fail:%v.", NodeServiceMethod, replyCall.Error)
} }
return replyCall.Error
} }
} }

View File

@@ -1,6 +1,7 @@
package network package network
import ( import (
"crypto/tls"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@@ -10,6 +11,11 @@ import (
"github.com/duanhf2012/origin/sysmodule" "github.com/duanhf2012/origin/sysmodule"
) )
type CA struct {
certfile string
keyfile string
}
type HttpServer struct { type HttpServer struct {
port uint16 port uint16
@@ -18,8 +24,7 @@ type HttpServer struct {
writetimeout time.Duration writetimeout time.Duration
httpserver *http.Server httpserver *http.Server
certfile string caList []CA
keyfile string
ishttps bool ishttps bool
} }
@@ -41,17 +46,35 @@ func (slf *HttpServer) Start() {
func (slf *HttpServer) startListen() error { func (slf *HttpServer) startListen() error {
listenPort := fmt.Sprintf(":%d", slf.port) listenPort := fmt.Sprintf(":%d", slf.port)
var tlscatList []tls.Certificate
var tlsConfig *tls.Config
for _, cadata := range slf.caList {
cer, err := tls.LoadX509KeyPair(cadata.certfile, cadata.keyfile)
if err != nil {
service.GetLogger().Printf(sysmodule.LEVER_FATAL, "load CA [%s]-[%s] file is error :%s", cadata.certfile, cadata.keyfile, err.Error())
os.Exit(1)
return nil
}
tlscatList = append(tlscatList, cer)
}
if len(tlscatList) > 0 {
tlsConfig = &tls.Config{Certificates: tlscatList}
}
slf.httpserver = &http.Server{ slf.httpserver = &http.Server{
Addr: listenPort, Addr: listenPort,
Handler: slf.handler, Handler: slf.handler,
ReadTimeout: 10 * time.Second, ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20, MaxHeaderBytes: 1 << 20,
TLSConfig: tlsConfig,
} }
var err error var err error
if slf.ishttps == true { if slf.ishttps == true {
err = slf.httpserver.ListenAndServeTLS(slf.certfile, slf.keyfile) err = slf.httpserver.ListenAndServeTLS("", "")
} else { } else {
err = slf.httpserver.ListenAndServe() err = slf.httpserver.ListenAndServe()
} }
@@ -66,8 +89,10 @@ func (slf *HttpServer) startListen() error {
} }
func (slf *HttpServer) SetHttps(certfile string, keyfile string) bool { func (slf *HttpServer) SetHttps(certfile string, keyfile string) bool {
slf.certfile = certfile if certfile == "" || keyfile == "" {
slf.keyfile = keyfile return false
}
slf.caList = append(slf.caList, CA{certfile, keyfile})
slf.ishttps = true slf.ishttps = true
return true return true
} }

View File

@@ -1,6 +1,7 @@
package network package network
import ( import (
"crypto/tls"
"errors" "errors"
"fmt" "fmt"
"net/http" "net/http"
@@ -31,6 +32,7 @@ type IMessageReceiver interface {
OnDisconnect(clientid uint64, err error) OnDisconnect(clientid uint64, err error)
OnRecvMsg(clientid uint64, msgtype int, data []byte) OnRecvMsg(clientid uint64, msgtype int, data []byte)
OnHandleHttp(w http.ResponseWriter, r *http.Request) OnHandleHttp(w http.ResponseWriter, r *http.Request)
IsInit() bool
} }
type Reciver struct { type Reciver struct {
@@ -65,9 +67,9 @@ type WebsocketServer struct {
httpserver *http.Server httpserver *http.Server
reciver map[string]Reciver reciver map[string]Reciver
certfile string caList []CA
keyfile string
iswss bool iswss bool
} }
const ( const (
@@ -114,17 +116,34 @@ func (slf *WebsocketServer) SetupReciver(pattern string, messageReciver IMessage
func (slf *WebsocketServer) startListen() { func (slf *WebsocketServer) startListen() {
listenPort := fmt.Sprintf(":%d", slf.port) listenPort := fmt.Sprintf(":%d", slf.port)
var tlscatList []tls.Certificate
var tlsConfig *tls.Config
for _, cadata := range slf.caList {
cer, err := tls.LoadX509KeyPair(cadata.certfile, cadata.keyfile)
if err != nil {
service.GetLogger().Printf(sysmodule.LEVER_FATAL, "load CA %s-%s file is error :%s", cadata.certfile, cadata.keyfile, err.Error())
os.Exit(1)
return
}
tlscatList = append(tlscatList, cer)
}
if len(tlscatList) > 0 {
tlsConfig = &tls.Config{Certificates: tlscatList}
}
slf.httpserver = &http.Server{ slf.httpserver = &http.Server{
Addr: listenPort, Addr: listenPort,
Handler: slf.initRouterHandler(), Handler: slf.initRouterHandler(),
ReadTimeout: 10 * time.Second, ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20, MaxHeaderBytes: 1 << 20,
TLSConfig: tlsConfig,
} }
var err error var err error
if slf.iswss == true { if slf.iswss == true {
err = slf.httpserver.ListenAndServeTLS(slf.certfile, slf.keyfile) err = slf.httpserver.ListenAndServeTLS("", "")
} else { } else {
err = slf.httpserver.ListenAndServe() err = slf.httpserver.ListenAndServe()
} }
@@ -244,7 +263,9 @@ func (slf *WebsocketServer) initRouterHandler() http.Handler {
r := mux.NewRouter() r := mux.NewRouter()
for pattern, reciver := range slf.reciver { for pattern, reciver := range slf.reciver {
r.HandleFunc(pattern, reciver.messageReciver.OnHandleHttp) if reciver.messageReciver.IsInit() == true {
r.HandleFunc(pattern, reciver.messageReciver.OnHandleHttp)
}
} }
cors := cors.AllowAll() cors := cors.AllowAll()
@@ -252,8 +273,10 @@ func (slf *WebsocketServer) initRouterHandler() http.Handler {
} }
func (slf *WebsocketServer) SetWSS(certfile string, keyfile string) bool { func (slf *WebsocketServer) SetWSS(certfile string, keyfile string) bool {
slf.certfile = certfile if certfile == "" || keyfile == "" {
slf.keyfile = keyfile return false
}
slf.caList = append(slf.caList, CA{certfile, keyfile})
slf.iswss = true slf.iswss = true
return true return true
} }