talkincode / toughradius

toughradius provides radius server, tr069 acs
http://www.toughradius.net
GNU General Public License v3.0
570 stars 275 forks source link

请教如何获取 challenge 和 response #151

Open G-Akiraka opened 1 year ago

G-Akiraka commented 1 year ago

challenge := microsoft.MSCHAPChallenge_Get(r.Packet) response := microsoft.MSCHAP2Response_Get(r.Packet)

通过h3c、华硕、openwrt、unifi 无法获取到内容,都为空,想请教知道是为什么,我通过mschapv2去认证 我参考了 https://github.com/layeh/radius/blob/master/vendors/microsoft/mschapv2-server-example.go 直接验证无法验证通过,通过freeradius的radtest -x -t mschap aka 123 127.0.0.1 0 test 可以通过,但是移动设备认证无法验证通过

我有尝试这样操作,由于无法获取到 challenge 与 response 导致无法返回 recvKey与sendKey,想知道是不是少了什么东西导致无法获取 microsoft.MSMPPERecvKey_Add(responsePacket, recvKey) microsoft.MSMPPESendKey_Add(responsePacket, sendKey)

package main

import (
    "fmt"
    "layeh.com/radius"
    "layeh.com/radius/rfc2865"
    "layeh.com/radius/rfc2868"
    "layeh.com/radius/rfc2869"
    "layeh.com/radius/vendors/microsoft"
    "log"
)

func runRadiusServer() {
    handler := func(w radius.ResponseWriter, r *radius.Request) {
        username := rfc2865.UserName_GetString(r.Packet)
        challenge := microsoft.MSCHAPChallenge_Get(r.Packet)
        response := microsoft.MSCHAP2Response_Get(r.Packet)
        fmt.Println("challenge", challenge)
        fmt.Println("response", response)

        log.Printf("[radius] Access denied for %s", username)
        responsePacket := r.Response(radius.CodeAccessAccept)
        success := make([]byte, 43)
        rfc2869.AcctInterimInterval_Add(responsePacket, rfc2869.AcctInterimInterval(3600))
        rfc2868.TunnelMediumType_Add(responsePacket, 0, rfc2868.TunnelMediumType_Value_IPv4)
        microsoft.MSCHAP2Success_Add(responsePacket, []byte(success))
        ////microsoft.MSMPPERecvKey_Add(responsePacket, recvKey)
        ////microsoft.MSMPPESendKey_Add(responsePacket, sendKey)
        microsoft.MSMPPEEncryptionPolicy_Add(responsePacket, microsoft.MSMPPEEncryptionPolicy_Value_EncryptionAllowed)
        microsoft.MSMPPEEncryptionTypes_Add(responsePacket, microsoft.MSMPPEEncryptionTypes_Value_RC440or128BitAllowed)
        w.Write(responsePacket)
    }

    server := radius.PacketServer{
        Handler:      radius.HandlerFunc(handler),
        SecretSource: radius.StaticSecretSource([]byte("test")),
    }

    log.Printf("Starting Radius server on :1812")
    if err := server.ListenAndServe(); err != nil {
        log.Fatal(err)
    }
}

func main() {
    runRadiusServer()
}
jamiesun commented 1 year ago

看下原始RADIUS 报文,是否缺乏必要属性, 这个mschapv2 是需要客户端启用才会发送关键属性的

G-Akiraka commented 1 year ago

我有点不明白,我使用freeradius就可以正常连接上网,但是指向到程序代码则不行,从客户端角度出发客户端是一致的,但是结果却不相同,freeradius 似乎都有一个证书,是否和这个相关

jamiesun commented 1 year ago

一般radius认证是不需要证书的,只有eap模式可能会用到,mschapv2在普通认证模式和eap模式都会有,确认你是不是走的eap模式,toughradius目前本身还没有实现eap支持,但是可以将freeradius作为协议解析处理前端处理eap认证,toughradius作为数据管理后端,这个功能已经支持的很好了

jamiesun commented 1 year ago

移动设备认证走的应该就是 eap 认证

jamiesun commented 1 year ago

走eap 认证的时候, 相关的协议属性封装在eap-message 里面

G-Akiraka commented 1 year ago

好的谢谢,移动设备连接eap方法peap 阶段2是 mschapv2,我理解客户端过来应该不需要再次封装消息给 服务端,toughradius部分功能不满足需求,所以想自己改造下支持oauth2,等自己系统用户集成。现在遇到问题拿不到challenge和response,所以想是不是忽略了什么重要的东西。 wifi认证设置802.x 指向go 服务器并设置ip 秘钥,端口,实在想不到还有什么不对。

jamiesun commented 1 year ago

可以考虑使用前端freeradius 来解析协议, 后端用户管理使用 toughradius, 这样可以工作的很好,也是我暂时缺乏去实现的动力的原因

G-Akiraka commented 1 year ago

已经放弃了,改用深信服认证服务器 radius 指向go代码就可以获取到challenge,response,如果使用其他wifi控制器则不正常,有尝试结合freeradius,使用了reset方式,一堆难点也没什么文档参考。