IEEE802.11i协议(无线安全标准)作为IEEE802.11协议的一部分,制定了无线安全接入的标准。WPA和WPA2(RSN)是无线安全标准中的两种密钥管理规范。WPA(或WPA2)无线安全接入又包括使用802.1x协议认证的企业版和使用PSK(预共享密钥)认证的个人版。Supplicant是无线客户端上实现WPA/802.1x认证功能的组件。
wpa_supplicant是无线客户端上实现密钥管理和认证的supplicant软件(对应服务器端的软件则为hostapd)。
见 http://hostap.epitest.fi/wpa_supplicant/
1)与硬件和驱动不相关性。
wpa_supplicant作为应用层软件,是伴随着IEEE802.11标准的发展以及各种硬件驱动软件的发展和不断完善成熟的。与硬件驱动的不相关性的设计目标也是为了在不同操作系统上的移植以及支持早期的各种wifi协议栈驱动软件。wpa_supplicant可以支持windows的ndis驱动,linux平台的hosap驱动,madwif驱动,ralink和atheros驱动,以及目前linux内核中主流支持的mac80211协议栈驱动。
2)OS不相关性
wpa_supplicant支持windows(包括wince),linux,BSD和Mac OS X以及嵌入式系统。
3)所有WPA功能C代码的可移植性。
4)wpa_supplicant是以守护进程的方式运行,通过控制接口由其他外部控制软件(wpa_cli, wpa_gui或者其他用户开放的软件进行配置控制无线接入)。
总之,灵活的可移植性,可配置编译方式可以方便地让开发者根据需要在不同开发平台和嵌入式系统上实现WPA的安全认证功能。
上图为wpa_supplicant的基本架构图(摘自wpa_supplicant官网开发文档图)。
1. event loop 是核心事件处理模块,也是wpa_supplicant的主进程程序。从模块名可知,它负责事件处理,处理所有的其他模块发送过来的事件以及超时事件。并且是loop循环执行的。
2. driver i/f模块,是负责配置控制无线驱动的API接口。真正的功能则在wext,hosap,madwifi等接口模块中实现。这些驱动接口模块针对不同的OS 无线驱动的配置接口标准,或者驱动开发者自定义的配置接口。wext是linux系统早期定义的无线配置接口标准,nl80211也是linux无线配置接口,与wext相比有些技术上的优势(图中未列出)。
3. driver event模块。wlan网络设备驱动有些事件需要通知wpa_supplicant,让wpa_supplicant进行下一步的处理。包括网络连接,断开,MIC校验错,关联成功等等。该模块的实现也是OS相关的,不同的操作系统,事件通知的机制不同。
4. L2 packet模块。WPA(WPA2)的安全认证是通过EAPOL帧(以太类型0x888E)来完成的。L2 packet模块就是完成驱动层到应用层的EAPOL的获取和EAPOL帧的发送。windows系统上采用NDIS协议驱动的抓包技术,wpa_supplicant的实现支持NDISUIO协议驱动(微软提供的协议驱动)抓包,winpcap的协议驱动抓包技术。linux系统上则采用Packet socket抓包技术。
5. Configuration模块。无线配置功能模块。
6. Ctrl i/f模块。提高外部配置程序的控制和事件通知。
7. WPA/WPA2状态机。实现WPA/WPA2的密钥协商。
8. EAPOL状态机。802.1x的状态机实现。
9. EAP状态机。企业级安全认证实现。