diff --git a/README.md b/README.md index b0fa7a6..ceb451f 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ AnyLink 是一个企业级远程办公 sslvpn 的软件,可以支持多人同 AnyLink 基于 [ietf-openconnect](https://tools.ietf.org/html/draft-mavrogiannopoulos-openconnect-02) 协议开发,并且借鉴了 [ocserv](http://ocserv.gitlab.io/www/index.html) 的开发思路,使其可以同时兼容 AnyConnect 客户端。 -AnyLink 使用 TLS/DTLS 进行数据加密,因此需要 RSA 或 ECC 证书,可以通过 Let's Encrypt 和 TrustAsia 申请免费的 SSL 证书。 +AnyLink 使用 TLS/DTLS 进行数据加密,因此需要 RSA 或 ECC 证书,可以使用私有自签证书,可以通过 Let's Encrypt 和 TrustAsia 申请免费的 SSL 证书。 AnyLink 服务端仅在 CentOS 7、CentOS 8、Ubuntu 18.04、Ubuntu 20.04 测试通过,如需要安装在其他系统,需要服务端支持 tun/tap 功能、ip 设置命令、iptables命令。 @@ -60,9 +60,9 @@ AnyLink 服务端仅在 CentOS 7、CentOS 8、Ubuntu 18.04、Ubuntu 20.04 测试 ### 使用问题 -> 对于测试环境,可以使用 vpn.test.vqilu.cn 绑定host进行测试 +> 对于测试环境,可以直接进行测试,需要客户端取消勾选【阻止不受信任的服务器(Block connections to untrusted servers)】 > -> 对于线上环境,必须申请安全的https证书(跟nginx使用的证书类型一致),不支持私有证书连接 +> 对于线上环境,尽量申请安全的https证书(跟nginx使用的pem证书类型一致) > > 群共享文件有相关客户端软件下载,其他版本没有测试过,不保证使用正常 > @@ -133,6 +133,7 @@ sudo ./anylink - [x] 流量压缩功能 - [x] 出口 IP 自动放行 - [x] 支持多服务的配置区分 +- [x] 支持私有自签证书 - [ ] 基于 ipvtap 设备的桥接访问模式 ## Config diff --git a/server/admin/server.go b/server/admin/server.go index 9c25878..f38d0c0 100644 --- a/server/admin/server.go +++ b/server/admin/server.go @@ -111,12 +111,6 @@ func StartAdmin() { selectedCipherSuites = append(selectedCipherSuites, s.ID) } - if tlscert, _, err := dbdata.ParseCert(); err != nil { - base.Fatal("证书加载失败", err) - } else { - dbdata.LoadCertificate(tlscert) - } - // 设置tls信息 tlsConfig := &tls.Config{ NextProtos: []string{"http/1.1"}, diff --git a/server/handler/link_auth.go b/server/handler/link_auth.go index 43e4c02..328b3fe 100644 --- a/server/handler/link_auth.go +++ b/server/handler/link_auth.go @@ -17,7 +17,10 @@ import ( "github.com/bjdgyc/anylink/sessdata" ) -var profileHash = "" +var ( + profileHash = "" + certHash = "" +) func LinkAuth(w http.ResponseWriter, r *http.Request) { // TODO 调试信息输出 @@ -138,7 +141,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) { other := &dbdata.SettingOther{} _ = dbdata.SettingGet(other) rd := RequestData{SessionId: sess.Sid, SessionToken: sess.Sid + "@" + sess.Token, - Banner: other.Banner, ProfileName: base.Cfg.ProfileName, ProfileHash: profileHash} + Banner: other.Banner, ProfileName: base.Cfg.ProfileName, ProfileHash: profileHash, CertHash: certHash} w.WriteHeader(http.StatusOK) tplRequest(tpl_complete, w, rd) base.Info("login", cr.Auth.Username, userAgent) @@ -178,6 +181,7 @@ type RequestData struct { Banner string ProfileName string ProfileHash string + CertHash string } var auth_request = ` @@ -223,7 +227,7 @@ var auth_complete = ` - 240B97A685B2BFA66AD699B90AAC49EA66495D69 + {{.CertHash}} diff --git a/server/handler/server.go b/server/handler/server.go index a378951..eadf549 100644 --- a/server/handler/server.go +++ b/server/handler/server.go @@ -1,13 +1,16 @@ package handler import ( + "crypto/sha1" "crypto/tls" + "encoding/hex" "fmt" "io" "net" "net/http" "net/http/httputil" "os" + "strings" "time" "github.com/bjdgyc/anylink/base" @@ -36,6 +39,19 @@ func startTls() { // certs[0], err = tls.LoadX509KeyPair(certFile, keyFile) // } + tlscert, _, err := dbdata.ParseCert() + if err != nil { + base.Fatal("证书加载失败", err) + } + dbdata.LoadCertificate(tlscert) + + // 计算证书hash值 + s1 := sha1.New() + s1.Write(tlscert.Certificate[0]) + h2s := hex.EncodeToString(s1.Sum(nil)) + certHash = strings.ToUpper(h2s) + base.Info("certHash", certHash) + // 修复 CVE-2016-2183 // https://segmentfault.com/a/1190000038486901 // nmap -sV --script ssl-enum-ciphers -p 443 www.example.com diff --git a/web/src/pages/group/List.vue b/web/src/pages/group/List.vue index cb28dce..0cca4dc 100644 --- a/web/src/pages/group/List.vue +++ b/web/src/pages/group/List.vue @@ -201,9 +201,9 @@
注:本地网络 指的是: - 运行 anyconnect 客户端的PC 所在的的网络,既本地路由网段。 + 运行 anyconnect 客户端的PC 所在的的网络,即本地路由网段。 开启后,PC本地路由网段的数据就不会走隧道链路转发数据了。 - 同时 anyconnect 客户端需要勾选本地网络(Local Lan)的开关,功能才能生效。 + 同时 anyconnect 客户端需要勾选本地网络(Allow Local Lan)的开关,功能才能生效。