Radius协议、EAP协议、EAP-MSCHAPv2、EAP-TLS、EAP-TTLS和EAP-PEAP

article/2025/10/11 13:02:21

1. Radius协议

Radius协议是目前AAA服务中所使用的最广泛的协议,它对认证,授权以及计费的功能都提供支持。Radius服务器通过建立一个唯一的用户数据库,存储用户名,用户密码等一系列信息,接入用户通过发送自己的用户名,密码,证书等信息给服务器来进行认证,认证成功后,服务器会给用户下发配置信息来完成授权,并且根据配置好的计费规则对用户进行计费。只有通过认证的用户,才能访问Radius服务器上的资源。

1.1 RADIUS协议实体

  • 无线终端 (Authenticating peer)
  • NAS (RADIUS Client)
  • RADIUS Server & Authenticator Server

1.2 RADIUS典型流程

RADIUS协议在进行处理的时候,认证过程和授权过程是在一起进行的,具体的操作是将授权信息放入到响应报文中。认证方法大致可以支持两种:

  • 基于数字证书的认证方法,基于数字证书的认证方法一般是利用TLS协议建立安全通道,然后在通道中交换数据,嵌套别的认证方法。
  • 基于密码的认证方法,基于密码的认证方法的例子有PAP认证和CHAP认证等。
    Radius协议基本流程

1.3 RADIUS报文格式

Radius协议报文格式

  • 代码(报文号)Code域占位一个字节,它用来标识Radius报文类型,下文列出了常见的代码编码与对应意义:
			1  接入请求报文2  接入成功回应报文3  接入拒绝回应报文4  计费请求报文5  计费回应报文11  接入挑战报文12  服务器状态报文13  客户端状态报文255  保留
  • 标识符Identifier域占位一个字节,用于匹配请求和回应报文。比如说,可以根据该值判断是否是重复请求报文,在某一个时间区间以内,如果两个报文来自于相同的地址和端口,而且具有相同的Idenfier值,则可以认定为是重复的报文。
  • 长度Length,长度域占位两个字节。它包含了报文中的Code域,Identifier域,Length域,Authenticator域和属性域的总长度。如果接收到的报文的长度大于这个值,则在接收报文时忽略多出来的字节;如果长度小于这个值,则说明报文不完整,直接丢弃报文。一个Radius报文的长度在20到4095个字节的范围内。
  • 认证字,Authenticator域占位16个字节。高位字节先传输。该域的值用来鉴别服务器的回应报文。
  1. 请求认证字:Authentictor的值是一个随机生成的16字节字符串。NAS和Radius服务器共享一个密钥,该共享密钥被加在请求认证字域后面,然后对之使用MD5算法生成一个16字节的摘要,将该摘要和用户输入的密钥进行异或,然后将异或结果放入接入请求报文的User-Password属性。
  2. 回应认证字:在访问接受、访问拒绝和访问挑战报文中。它的值定义为整个访问回应报文的内容和共享密钥进行MD5摘要计算得出的16字节字符串:从代码域开始,包含标识符域,长度域,接入请求报文中的请求认证字域和回应报文中的属性,然后后面加上共享密钥,即
ResponseAuth=MD5(Code+ID+Length+RequestAuth+Attributes+Secret)
  1. Accounting-Request认证字,其定义是整个Accounting-Request报文的内容和共享密钥进行MD5摘要计算得出的16字节字符串,其中在计算时Authentictor的16字节数据用16字节的0进行替换。计算公式为:
 MD5(Code+ID+Length+16 Zero Octets+Attributes+Secret)
  1. 计费回应报文中的认证字称为计费回应认证字。它的定义为整个计费回应报文的内容和共享密钥进行MD5摘要计算得出的16字节字符串,其中在进行计算时Authentictor的16字节数据用计费请求Accounting-Request报文的Authentictor进行替换。计算公式:
MD5(Code+ID+Length+Accounting-Request Authenticator+Attributes+Secret)

2. EAP介绍

EAP(可扩展身份认证协议)协议基于PPP(Point to Point Protocol,点对点协议)协议机制,是支持多种认证机制的PPP协议扩展。EAP支持客户端向实际用户多次请求认证信息,由服务器端执行具体的认证方法。这样,客户端通过EAP协议,在服务器端和接入用户之间传递认证报文。EAP协议为身份认证提供了一个框架,在该框架上,可以支持各种EAP认证方法。EAP认证相比于PAP认证和CHAP认证,对网络的接入管理更加严格,可以更好的保证网络应用中信息的安全。

2.1 EAP报文格式

EAP报文格式

  • 代码(报文号)Code域占位一个字节,它用来标识EAP报文类型,具体对应如下所示。
		1  EAP-Request,EAP请求2  EAP-Response,EAP回应3  EAP-Success,EAP成功4  EAP-Failure,EAP失败
  • 标识符Identifier占位一个字节,用于对请求和回应消息进行标识。
  • 长度Length,长度域占位两个字节。用于表示Code+Identifier+Length+Type+Data的总长度。
  • 类型Type,占据一个字节,用来表示具体的EAP报文认证类型,具体类型如下所示:
			1    EAP_Identity4    EAP_MD511   EAP_Challenge13   EAP_TLS21   EAP_TTLS25   EAP_PEAP26   EAP_MSCHAPv2
  • 数据Data,当Code为EAP-Success或者Code为EAP-Failure的时候,Data内容为空。其它类型报文的Data内容与Type类型相关。

2.2 EAP_MSCHAPv2

EAP_MSCHAPv2是一种双向相互认证的协议,认证过程是challenge-response式的。在认证过程中,服务器和客户端会进行双向验证,只要其中一方失败,则这个连接会被拒绝。EAP_MSCHAPv2通常不单独使用,通常是嵌套在EAP_PEAP认证方法中使用。

EAP_MSCHAPv2的认证过程

2.2.1 EAP_MSCHAPv2的认证过程

  1. 首先客户端给接入用户发送Identity报文,要求客户端提供身份标识;
  2. 接入用户给客户端回应Identity报文,内容是用户的身份标识,客户端对这个报文的处理是将之封装成Radius访问请求报文传给服务器;
  3. 服务器在获取到接入用户的接入标识后,会给客户端发送Radius访问挑战报文,客户端在收到这个报文后,对报文进行解封装,将报文中的EAP-Request/EAP-MSCHAPv2(Challenge)发送给接入用户,Challenge报文中包含有服务器端产生的Server-Challenge;
  4. 接入用户进行计算,发送Response报文给客户端,客户端在接收到该报文后,将该报文封装到Access-Request中传给服务器,Response报文中包含用户产生的Peer-Challenge和根据用户密码,用户名,Peer-Challenge和Server-Challenge为输入通过MD4和DES算法生成的NT-Response;
  5. 服务器对接入用户进行验证,具体验证的方法是服务器端使用同样的算法以用户密码,用户名,Peer-Challenge和Server-Challenge为输入计算出NT-Response,如果和Response报文中NT-Response匹配,则认证成功。在认证成功的基础下,会给客户端发Success-Request报文,Success-Request报文中含有以用户密码,用户名,Peer-Challenge,Server-Challenge以及NT-Response为输入使用MD4算法和DES算法计算出来的Message,客户端收到报文后,进行解封装,将报文中的Success-Request发送给接入用户,请求用户对服务器进行验证;
  6. 接入用户对服务器进行验证,具体验证的方法是用同样算法以用户密码,用户名,Peer-Challenge,Server-Challenge以及NT-Response为输入计算出Message,然后与Success-Request中的Message做匹配,如果匹配失败,则不再向服务器发送报文,如果匹配成功,则向客户端发送EAP-Request/EAP-MSCHAPv2(Success-Response)报文,客户端收到后,将报文封装成Access-Request报文传给服务器;
  7. 服务器如果接收到Success-Response报文,则说明验证成功,接入用户收到的报文将是EAP成功报文,到此整个认证流程结束。

在第5步中,服务器对接入用户验证失败时,服务器可以发送
EAP MSCHAPv2(Failure-Request,R=1,E=691)来要求用户重新输入密码进行重试,然后又重新从第4步开始进行认证过程。

2.2.2 EAP-Message和Message-Authenticator

在RFC2869中,Radius为支持EAP认证增加了两个属性EAP-Message和Message-Authenticator(消息认证码)。

  • EAP-Message属性中存放的是整个EAP认证包内容,下图展示了EAP-Message属性的封装,这个属性用来封装EAP数据包,类型代码为79,String域最长253字节,如果EAP数据包长度大于253字节,可以对其进行分片,依次封装在多个EAP-Message属性中。
    EAP属性封装
  • Message-Authenticator属性封装,类型代码为80。这个属性用于在使用EAP认证方法的过程中,避免接入请求包被窃听。在含有EAP-Message属性的数据包中,必须同时也包含Message-Authenticator,否则该数据包会被认为无效而被丢弃,而且服务器或用户收到报文后,还将使用EAP消息和共享密钥作为输入计算该值,如果与传过来的属性值不一致,也将丢弃这个报文。

对于Access-Request消息,需要使用共享密钥,Message-Authenticator计算方法为:

Message-Authenticator=MD5(Code+Type+Identifier+Length+16 Zero Octets+Attributes+Secret) 

对于Access-Challenge、Access-Accept、Access-Reject消息,Message-Authenticator计算方法为:

Message-Authenticator=MD5(Code+Type+Identifier+Length+Request Authenticator+Attributes+Secret) 

2.3 EAP_TLS

EAP_TLS是基于PKI证书体系的,要求客户端和服务器都必须拥有有效的证书,支持导出密钥的功能,而且是一种支持双向认证的认证方法。PKI证书体系是非常复杂的,在企业中已经部署PKI证书体系的情况下,EAP_TLS认证是一种很安全且很方便的认证方法,但是在企业没有部署的情况下,使用EAP_TLS进行认证将会很复杂。一般来说,EAP_TLS用于验证设备,而不是普通的接入用户。

TLS协议由TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)两个协议组成。TLS握手协议使用了公共密钥和证书,在客户端和服务器之间进行通信之前协商算法和加密实际数据传输的密钥,该过程在TLS记录协议之上进行,TLS握手过程实际上就是通信双方协商交换一个用于对称加密的密钥的过程,这个过程实际上产生三个随机数:client random, server random,pre-master secret。前两个随机数都是明文传送的,只有pre-master secret是加密的(RSA或DHP)。一般生成证书的时候,签名算法可以使用RSA或者DSA。如果server使用RSA证书,RSA既可以用作签名也可以用作不对称加密,pre-master secret就是用server的RSA证书中包含的公钥加密的。如果server使用DSA证书,DSA只能完成签名的功能,所以交换密钥的功能还得由DH算法实现。TLS记录协议的作用是对数据进行处理,包括加密,压缩和重组等,而且会将处理后的数据传递给高层用户。

EAP_TLS虽然安全性能高,但是证书维护成本高且配置难度高,而且EAP_TLS在传送用户名的时候没有加密,即抓包的时候EAP_Identity报文中的用户名是明文显示的,可以考虑用EAP_PEAP或者是EAP_TTLS来代替,这两种认证方式不需要建立复杂的PKI系统,可以在TLS隧道内嵌套其他的认证方法,这不仅使复杂度大大降低,而且还提高了安全性。

2.3.1 EAP_TLS认证过程

EAP_TLS的认证过程(以签名算法使用RSA为例)如图所示:
EAP-TLS认证过程

  1. 首先客户端给接入用户发送Identity报文,要求客户端提供身份标识;
  2. 接入用户给客户端回应Identity报文,内容是用户的身份标识,客户端将这个报文封装成Radius访问请求报文传给服务器;
  3. 服务器在获取到接入用户的接入标识后,会给客户端发送Radius访问挑战报文,客户端在收到这个报文后,对报文进行解封装,将TLS-Start报文传给接入用户;
  4. 接入用户发送TLS Client Hello报文给客户端,Client Hello报文中包括支持的TLS协议版本,支持的的加密算法,支持的压缩方法以及客户端随机数等,客户端收到后,将该报文封装到Access-Request中传给服务器;
  5. 客户端在收到服务器发来的Radius访问质询报文后,将TLS Server Hello报文传给接入用户,这个报文中包括server_hello,certificate,certificate_request,server_hello_done,其中server_hello报文中包括确认使用的TLS协议版本,服务器生成的服务器随机数(server random),session ID,确认使用的加密算法等,certificate代表的是服务器证书,certificate_request代表的是请求客户端提供证书,server_hello_done代表的是整个server hello过程的结束。
  6. 接入用户给客户端发送TLS change cipher spec报文,这个报文将被客户端封装成Access-Request报文传给服务器,change cipher spec报文包括以下内容,其中certificate指的是客户端证书,client_key_exchange包含pre-master secret,客户端生成的第三个随机数,pre-master secret首先采用RSA算法,生成一个48字节随机数,然后用server的公钥加密之后再放入报文中,certificate_verify中的内容是到这一步为止收到和发送的所有握手消息签名结果,change_cipher_spec的作用是客户端通知服务器开始使用加密方式发送报文,客户端使用上面的3个随机数client random, server random,pre-master secret,计算出48字节的master secret,这个就是对称加密算法的密钥,finished为发送的第一个加密报文,它使用HMAC算法计算收到和发送的所有握手消息的摘要,然后通过RFC5269中定义的一个伪函数PRF计算出结果,加密后发送;
  7. 服务器给客户端发送Access-Challenge报文,接入用户将收到TLS change cipher spec报文,到这儿握手结束;
  8. 客户端在收到接入用户发送的EAP-TLS报文后,将这个报文封装成Access-Request报文传给服务器;
  9. 服务器给客户端发送Access-Accept报文,接入用户将收到EAP-Success。

2.4 EAP_TTLS

EAP_TTLS协议的规范文档是RFC5281,EAP_TTLS是EAP_TLS的一种扩展,与EAP_TLS的区别是对证书的要求没有那么严格,只需要提供服务器端证书,而客户端证书不是必须的。
EAP_TTLS是一个复合的认证方法,主要包括两个阶段:

  • 第一个阶段是在用户和认证服务器之间建立TLS隧道
  • 第二阶段是在已经建立的隧道内使用其他的认证方法进行认证。该认证通过在TLS通道内嵌套其他的认证方法来完成对客户端的认证,也具有很高的安全性。TTLS的扩展性很好,几乎支持所有的认证方法,包括MSCHAPv2。

2.5 EAP_PEAP

EAP_PEAP是一个复合的认证方法,主要包括两个阶段:

  • 第一个阶段是在用户和认证服务器之间建立TLS隧道,
  • 第二阶段是在已经建立的隧道内使用其他的EAP方法进行认证,如EAP-MSCHAPv2。

EAP_PEAP的认证过程,具体流程如下:

  1. 握手阶段和EAP_TLS相似,与之不同的是,只需要服务器发送证书给客户端,实现客户端对服务器的认证,客户端不再需要发送自身的证书给服务器;
  2. 服务器给客户端发送Access-Challenge报文,客户端收到报文之后,解封装该报文,将其中的Identity报文传给接入用户;
  3. 客户端在收到接入用户发来的回应报文Identity后,将读报文封装在Access-Request中传给服务器;
  4. 服务器根据用户的Identity査找该接入用户的认证方法,在获取认证方法之后,向接入用户发送嵌套的认证方法的Challenge报文;
  5. 根据嵌套的认证方法的类型,接入用户和服务器进行相应的认证过程,直到服务器对接入用户认证成功;
  6. 服务器对接入用户认证成功后,给客户端发送访问质询报文,客户端将其中的Result=Success报文传给接入用户;
  7. 同样的,接入用户在收到报文后,给客户端发送EAP回应报文,客户端将EAP报文封装成访问请求的格式传给服务器;
  8. 服务器给接入用户发送Access-Accept报文,接入用户将收到EAP-Success。

EAP_TTLS和EAP_PEAP还可以支持快速恢复TLS会话。在认证的第二阶段成功的情况下,无须执行认证第一阶段或第二阶段就能够恢复该会话,可以通过发送一条EAP-Success消息来进行重新身份验证尝试,这称为快速重连。这可以减少域间切换的延迟。


http://chatgpt.dhexx.cn/article/fm0WC64E.shtml

相关文章

使用 freeradius 搭建 EAP PEAP MS-CHAPv2 验证环境

企业级 Wi-Fi 搭建起来有点小复杂,我们知道自己家使用的 Wi-Fi 非常简单,几乎只需要配置一下热点的 SSID 和密码就可以了,实际上这是两种 Wi-Fi 认证类型。想要快速部署企业级 Wi-Fi 验证环境,首先要理解企业级 Wi-Fi 部署的一些核…

IEEE 802.1X-PEAP认证过程分析(抓包)

IEEE 802.1X-PEAP认证过程分析(抓包) 本文介绍IEEE802.1X认证的PEAP认证方式,是带有radius服务器的EAP中继认证。 IEEE802.1X认证是使用EAP报文格式在申请者和认证者之间交换信息。带有radius服务器,即认证者不对申请者发送的数据…

PEP是什么

转载 :https://www.cnblogs.com/abella/p/10056875.html PEP是什么? PEP的全称是Python Enhancement Proposals,其中Enhancement是增强改进的意思,Proposals则可译为提案或建议书,所以合起来,比较常见的翻…

企业级无线渗透之PEAP

0x00 前言 上月,受邀在C-SEC上海快递行业安全会议上做了关于无线安全威胁的议题分享。介绍了家庭级的无线网络薄弱环节及攻击方法,同时列举了乌云上因无线边界被突破,造成内网沦陷的诸多例子。后半部分,简要的介绍了企业级无线网络…

深度讲解linux中fputc()函数

字符写入fputc函数 int fputc(int char, FILE *stream) 返回值 如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。 ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符&…

文件操作之函数fputc(),fgetc()

目录 引言 一、fputc()与putchar()的联系 二、fgetc()与getchar()的联系 总结 引言 引用自《C程序设计-清华大学出版社 (2017)》 一、fputc()与putchar()的联系 fputc(ch,fp)是将ch输出到fp所指的文件里面putchar(ch)是将ch输出到屏幕 FILE*fpfopen("text.txt",…

文件操作:fgetc与fputc函数的使用

在成功打开文件后,我们便可以对文件进行操作,以下是字符输入函数fgetc和字符输出函数fputc的简单使用说明。 如果还不知道如何打开文件的可以看看我的另一篇文章。 点我 fputc函数的使用 当我们以读的形式打开文件的时候,便可以使用fputc函数…

c语言中fputc函数的作用是,C语言中fputc函数的用法_后端开发

Python画ROC曲线和AUC值计算(附代码)_后端开发 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器的优劣。这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC。 C语言中fputc函数的用法 C语言中fputc函数…

C语言文件操作入门:fopen、fclose、fputc、fgetc、fputs、fgets、fprintf、fscanf、fwrite、fread详解

本篇文章主要讲解4组函数: 字符读写:fputc和fgetc。文本行读写:fputs和fgets。格式化读写:fprintf和fscanf。二进制读写:fwrite和fread。 预备知识:fopen和fclose 如果我们要读写一个文件,就必…

linux fputc fgetc fseek rewind 函数

目录 前言fputc 函数fgetc 函数fseek函数rewind函数 前言 <sprintf fprintf 函数 > 前一节讲了 sprintf fprintf 函数 的缓存问题 在他们的基础上加了一个while&#xff08;1&#xff09;&#xff1b; 来验证 结果都是输出的 不管怎么样 都会写入到内核态 内核态在输出…

c语言中fputc函数的作用是,C语言中fputc函数的用法

C语言中fputc函数的用法 C语言中fputc函数的用法为“int fgetc (FILE *fp)”&#xff0c;该函数的作用是从指定的文件中读取一个字符&#xff0c; 读取成功时会返回读取到的字符&#xff0c;读取到文件末尾或读取失败时返回EOF。推荐教程&#xff1a;《C语言》 示例代码#includ…

STM32重写fputc

操作步骤 01、在项目中&#xff0c;加上以下函数即可&#xff08;作用&#xff1a;重写fputc&#xff09; 库函数版 int fputc( int ch, FILE *f ){ USART_SendData(USART1,(u8) ch ); while(USART_GetFlagStatus(USART1,USART_F…

STM32重写fputc汇总

1. 在工程项目中加上函数fputc 例如&#xff1a; 库函数版 int fputc( int ch, FILE *f ) {USART_SendData(USART2,(u8) ch );while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)RESET);return ch; }寄存器版 int fputc(int ch, FILE *f){ while((USART2->SR&0X40)0)…

Keil 重定向 fputc 函数 以及 printf 函数的代码尺寸测试

本文的开发环境为 Keil Cortex-M3 内核处理器。 重定向 fputc 函数方法 如果想使用库函数 printf &#xff0c;必须要将 fputc 重定向到自己的串口上。 术语 重定向 可以理解为用户重写 fputc 函数&#xff0c;在重写的函数体内调用自己硬件的串口发送函数。 在 Keil 环境中…

fputc函数

/****************************************功能&#xff1a;写一个字节到文件流中*参数&#xff1a;* c 写入的字符* stream 流指针*返回值&#xff1a;* 成功返回字符* 失败返回EOF或errno*************************************/ int fputc(int c, FILE *stre…

标准c库:fputc,fgetc,feof

1、了解标准c库fopen等用法&#xff08;点击跳转&#xff09; 2、fputc写一个字符到文件 #include <stdio.h>int main() {FILE *fp;fp fopen("./test.txt","w");//int fputc(int c, FILE *stream);fputc(a,fp);fclose(fp);return 0; }3、fputc写一…

文件的输入输出函数

文章目录 前言字符输入输出函数 - fgetc和fputc文本输入输出函数 - fgets和fputs格式化输入输出函数 - fscanf和fprintf二进制输入输出函数 - fread和fwrite 前言 在文件操作函数&#xff08;一&#xff09;中&#xff0c;我们已经学会了怎样正确地打开和关闭一个文件&#xf…

计算机网络 | 传输层的两个重要协议——TCP、UDP

目录 传输层概述 传输层的作用 运输层端口号、复用与分用的概念 发送方的复用和接收方的分用 UDP和TCP的对比 TCP的流量控制 TCP的拥塞控制 TCP的差错控制 UDP的差错控制的和流控 TCP的封装格式 TCP主要特点 TCP的连接 可靠传输的工作原理 TCP连接的三次握手和四次挥…

以太网协议

以太网(Ethernet) 以太网是一种局域网技术,其规定了访问控制方法、传输控制协议、网络拓扑结构、传输速率等,完成数据链路层和物理层的一些内容,它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collisi…

传输层TCP协议和UDP协议

传输层协议 文章目录 传输层协议传输层&#xff1a;传输层协议&#xff1a;UDP协议&#xff1a;TCP协议&#xff1a;UDP协议和TCP协议的比较&#xff1a;适用场景&#xff1a; 传输层&#xff1a; 传输层是OSI中最重要&#xff0c;最关键的一层,是唯一负责总体的数据传输和数据…