toughradius icon indicating copy to clipboard operation
toughradius copied to clipboard

请教如何获取 challenge 和 response

Open G-Akiraka opened this issue 1 year ago • 8 comments

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()
}

G-Akiraka avatar Jul 15 '23 01:07 G-Akiraka

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

jamiesun avatar Jul 28 '23 03:07 jamiesun

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

G-Akiraka avatar Jul 31 '23 13:07 G-Akiraka

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

jamiesun avatar Aug 01 '23 06:08 jamiesun

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

jamiesun avatar Aug 01 '23 06:08 jamiesun

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

jamiesun avatar Aug 01 '23 06:08 jamiesun

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

G-Akiraka avatar Aug 01 '23 14:08 G-Akiraka

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

jamiesun avatar Aug 19 '23 17:08 jamiesun

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

G-Akiraka avatar Aug 30 '23 03:08 G-Akiraka