我在 TeamsACS tr069/server.go 中只找到了 BasicAuth middleware, 并没有 http digest auth (准确地说 auth_client.go 中有实现,但是 server 逻辑里没有).
Basic Auth
TeamsACS 中 basic auth 的实现很敷衍,并没有校验密码。有几种可能:
- 要么我代码没有看仔细,逻辑有遗漏。可以给 CPE 模拟器增加 BootStrap 事件等模拟通信,由后台生成账号/密码,并观察后续流程
- 要么 TeamsACS 作为开源版本,隐藏了部分实现
- 支持 TLS 的情况下,ACS 不需要实现 http digest auth 只需要 basic auth。还是得看看 tr069 协议规范中关于 basic auth 和 digest auth 的部分,哎,这也太烦了
s.root.Use(middleware.BasicAuthWithConfig(middleware.BasicAuthConfig{
Skipper: func(c echo.Context) bool {
// 只有两种情况跳过 basic auth
rpath := c.Request().RequestURI
if strings.HasPrefix(rpath, "/cwmpfiles") ||
strings.HasPrefix(rpath, "/cwmpupload") {
return true
} else {
return false
}
},
Validator: func(username, password string, c echo.Context) (bool, error) {
// 增加一条 debug 日志,判断 CPE 请求是否携带了 username / password
// [2023-04-29T10:37:17+08:00] DEBUG tr069/server.go:81 Basic Auth username: 8KA8WA1151100043, password:
log.Debugf("Basic Auth username: %s, password: %s", username, password)
// 这也太敷衍了吧
if username == "" {
return false, nil
}
return true, nil
},
Realm: "Restricted",
}))
这个 username 来自 CPE 模拟器的序列号:
genieacs-sim> grep 8KA8WA1151100043 -r .
./data_model_202BC1-BM632w-8KA8WA1151100043.csv:DeviceID.SerialNumber,false,false,8KA8WA1151100043,xsd:string
./data_model_202BC1-BM632w-8KA8WA1151100043.csv:InternetGatewayDevice.ManagementServer.Username,false,true,8KA8WA1151100043,xsd:string
./genieacs-sim: .option("-m, --data-model [filename]", "Data model template", resolvePath, "./data_model_202BC1-BM632w-8KA8WA1151100043.csv")
HTTP Digest Auth
TeamsACS 中的 Digest Auth 实现似乎只用在了 ACS 向 CPE 发送请求的过程中。
> grep digest -r -i common/
common/cwmp/auth_client.go: var authorization map[string]string = DigestAuthParams(resp)
common/cwmp/auth_client.go: AuthHeader := fmt.Sprintf(`Digest username="%s", realm="%s", nonce="%s", uri="%s", cnonce="%s", nc=00000001, qop=%s, response="%s", opaque="%s", algorithm=MD5`,
common/cwmp/auth_client.go: auth parameters or nil if the header is not a valid parsable Digest
common/cwmp/auth_client.go:func DigestAuthParams(r *http.Response) map[string]string {
common/cwmp/auth_client.go: if len(s) != 2 || s[0] != "Digest" {
common/cwmp/auth_client.go: H function for MD5 algorithm (returns a lower-case hex MD5 digest)
common/cwmp/auth_client.go: digest := md5.New()
common/cwmp/auth_client.go: digest.Write([]byte(data))
common/cwmp/auth_client.go: return fmt.Sprintf("%x", digest.Sum(nil))
更多
> grep ConnectionRequestAuth -r -i common/
common/cwmp/auth_client.go:func ConnectionRequestAuth(username string, password string, uri string) (bool, error) {
> grep ConnectionRequestAuth -r -i tr069/
> grep ConnectionRequestAuth -r -i controllers/
controllers/supervise/cwmp.go: isok, err := cwmp.ConnectionRequestAuth(dev.Sn, app.GApp().GetTr069SettingsStringValue("CpeConnectionRequestPassword"), dev.CwmpUrl)
其他
- golang echo 框架内置的 middleware 比 gin 要丰富很多,文档也更详细一些。第一印象不错
微信关注我哦 👍
我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式