授权
Copyright (c) 2003-2009, Jouni Malinen <[email protected]>
本程序是GPL版本2和BSD许可证双授权,两者随意选择。
功能
支持WPA/IEEE 802.11i功能:
- WPA-PSK ("WPA-Personal")
- WPA with EAP (e.g., with RADIUS authentication server) ("WPA-Enterprise")
Following authentication methods are supported with an integrate IEEE 802.1X
Supplicant:
* EAP-TLS
* EAP-PEAP/MSCHAPv2 (both PEAPv0 and PEAPv1)
* EAP-PEAP/TLS (both PEAPv0 and PEAPv1)
* EAP-PEAP/GTC (both PEAPv0 and PEAPv1)
* EAP-PEAP/OTP (both PEAPv0 and PEAPv1)
* EAP-PEAP/MD5-Challenge (both PEAPv0 and PEAPv1)
* EAP-TTLS/EAP-MD5-Challenge
* EAP-TTLS/EAP-GTC
* EAP-TTLS/EAP-OTP
* EAP-TTLS/EAP-MSCHAPv2
* EAP-TTLS/EAP-TLS
* EAP-TTLS/MSCHAPv2
* EAP-TTLS/MSCHAP
* EAP-TTLS/PAP
* EAP-TTLS/CHAP
* EAP-SIM
* EAP-AKA
* EAP-PSK
* EAP-PAX
* EAP-SAKE
* EAP-IKEv2
* EAP-GPSK
* LEAP (note: requires special support from the driver for IEEE 802.11
authentication)
(following methods are supported, but since they do not generate keying
material, they cannot be used with WPA or IEEE 802.1X WEP keying)
* EAP-MD5-Challenge
* EAP-MSCHAPv2
* EAP-GTC
* EAP-OTP
- key management for CCMP, TKIP, WEP104, WEP40
- RSN/WPA2 (IEEE 802.11i)
* pre-authentication
* PMKSA caching
Supported TLS/crypto libraries:
- OpenSSL (default)
- GnuTLS
Internal TLS/crypto implementation (optional):
- can be used in place of an external TLS/crypto library
- TLSv1
- X.509 certificate processing
- PKCS #1
- ASN.1
- RSA
- bignum
- minimal size (ca. 50 kB binary, parts of which are already needed for WPA;
TLSv1/X.509/ASN.1/RSA/bignum parts are about 25 kB on x86)
需求
Wpa_supplicant是为不同的驱动和操作系统而设计成可移植的.希望以后会有更多的无线网卡和OSes添加进来。关于wpa_supplicant的设计以及移植等详细信息可参看http://hostap.epitest.fi/wpa_supplicant/devel/。其目的是将整个WPA/WPA2的支持添加到linux无线扩展,允许支持新驱动而不需在wpa_supplicant添加新接口。
WPA
IEEE 802.11 标准协议里的原始安全机制并不够强大,不满足大多数对安全要求较高的网络。IEEE 802.11任务组I旨在修复原始协议的这个缺陷并于2004年5月完成测试.IEEE 802.11i对IEEE 802.11 的修改案于2004年6月完成认证,2004年7月正式发布。
Wi-Fi 联盟(http://www.wi-fi.org/)使用IEEE 802.11i草案3.0以增强现存的wlan硬件的安全特性。这就是Wi-Fi安全访问Wi-Fi Protected Access<TM>,简称wpa。Wpa已被Wi-Fi联盟指定为功能测试和认证需要强制执行的一个环节。关于WPA的详细信息可参看http://www.wi-fi.org/OpenSection/protected_access.asp。
IEEE 802.11 标准用有线等效保密(WEP)算法保护无线网络。WEP使用RC4带40位密钥,24位作为初始化向量(IV),和CRC32用以防止数据包伪造。所有的这些选择已被证明是不足的:密钥空间过小不足以抵挡当前的攻击,RC4密钥调度是不足的(伪流头会被忽略),IV空间过小及IV重复使用使攻击更简单,没有重播保护,和没密钥认证,不防止位翻转分组数据
WPA 是安全性问题的一个折中方案。它使用临时密钥完整性协议(TKIP)代替WEP。TKIP是在高安全性和可能使用到的硬件里取的一个折中方案。它还是像WEP那样采用RC4编码方法,但每个包带有RC4密钥。另外它支持重播保护,密钥包认证机制(Michael MIC)。
密钥可以通过两种机制来管理。WPA可以使用一个外部认证服务器和EAP,就像IEEE 802.1X使用的那样;也可以使用预先共享密钥而不需要外部服务器。Wi-Fi称这些分别为”WPA-企业”和”WPA-个人”。两种机制都会为认证端和恳求端产生一个主会话密钥。
WPA支持一个新的密钥握手协议(4路握手和组握手),会在认证端和恳求端之间产生和交换数据编码密钥。该握手也用于确认认证端和恳求端都知道主会话密钥。这些握手会一致忽略密钥管理机制(仅产生主会话密钥的方式会发生变化)。
IEEE 802.11i / WPA2
IEEE 802.11i的部分设计并没有包含在WPA(2004年5月完成),该部分基于IEEE 802.11的修改在2004年7月才验证通过。Wi-Fi盟联使用最终的IEEE 802.11i作为WPA的一个新版本,称为WPA2。WPA2包括,如支持更多的强大的编码算法(CCMP:计数器模式带CBC-MAC的AES)来替代TKIP,优化handoff(去掉初始化密钥握手,预认证和PMKSA缓冲池的信息数量)
wpa_supplicant
wpa_supplicant 是WPA恳求端组件(运行在客户端的那部分)的执行程序,它负责协调WPA密钥与WPA认证端之间的沟通,EAP认证与认证服务器之间的沟通。另外,它还控制着漫游和IEEE 802.11的wlan驱动认证/协会
wpa_supplicant 被设计成一个运行在后台的守护程序,作为后端组件控制着无线连接。Wpa_supplicant支持单独的前端,像基于文件的前端wpa_cli,也是带有wpa_supplicant的。
以下步骤用于当一个AP使用WPA时:
- wpa_supplicant 请求内核驱动去扫描邻近基站设备时
- wpa_supplicant 根据配置选择基站设备
- wpa_supplicant 请求内核驱动去关联所选择的基站设备
- WPA-EAP模式:集成IEEE 802.1X恳求端完成与认证服务器的EAP认证
- WPA-EAP模式:接收到IEEE 802.1X恳求端发来的主密钥
- WPA-PSK模式:wpa_supplicant使用PSK作主密钥
- Wpa_supplicant 完成WPA 4路握手和与让证端的组密钥握手
- Wpa_supplicant 为单播和广播配置加密密钥
- 正常数据包可以传输和接收
Building and installing
为了能够编译wpa_supplicant,首先需要选择编译哪些部分。这是通过在根目录下创建一个.config文件来完成。配置选项是使用下面的文本行格式:
CONFIG_<option>=y
#开头的行表示注释,会被忽略。
Defconfig是一个示例配置文件,有列出可用的选项和附加注释
.config文件可以用于选择仅需要用到的功能,可以限制bin文件的大小和外部库的引用。
主要的配置是选择驱动接口(如hostap,madwifi,…)和包含哪些认证方式(如EAP-TLS,EAP-PEAP,…)。
下面的配置选项用于控制IEEE 802.1X/EAPOL,EAP状态机和所机EAP方式。
如果包含TLS,PEAP或者TTLS就需要连接OpenSSL库,以便可执行TLS操作。另外,GnuTLS或者内部TLSv1操作可以用于TLS功能。
CONFIG_IEEE8021X_EAPOL=y
CONFIG_EAP_MD5=y
CONFIG_EAP_MSCHAPV2=y
CONFIG_EAP_TLS=y
CONFIG_EAP_PEAP=y
CONFIG_EAP_TTLS=y
CONFIG_EAP_GTC=y
CONFIG_EAP_OTP=y
CONFIG_EAP_SIM=y
CONFIG_EAP_AKA=y
CONFIG_EAP_PSK=y
CONFIG_EAP_SAKE=y
CONFIG_EAP_GPSK=y
CONFIG_EAP_PAX=y
CONFIG_EAP_LEAP=y
CONFIG_EAP_IKEV2=y
下面的配置选项可以包含GSM/USM接口,用于GSM/UMTS认证算法(EAP-SIM/EAP-AKA需要用到)。这就需要pscs-lite(http://www.linuxnet.com/)来访问智能卡。
CONFIG_PCSC=y
下面的配置选项可以添加到.config,用于选用包含哪些驱动接口。Hermes驱动接口需要从Agere下载。
CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_HERMES=y
CONFIG_DRIVER_MADWIFI=y
CONFIG_DRIVER_ATMEL=y
CONFIG_DRIVER_WEXT=y
CONFIG_DRIVER_RALINK=y
CONFIG_DRIVER_NDISWRAPPER=y
CONFIG_DRIVER_BROADCOM=y
CONFIG_DRIVER_IPW=y
CONFIG_DRIVER_BSD=y
CONFIG_DRIVER_NDIS=y
下面示例包含wpa_supplicant包的所有功能和驱动接口:
CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_HERMES=y
CONFIG_DRIVER_MADWIFI=y
CONFIG_DRIVER_ATMEL=y
CONFIG_DRIVER_WEXT=y
CONFIG_DRIVER_NDISWRAPPER=y
CONFIG_DRIVER_BROADCOM=y
CONFIG_DRIVER_IPW=y
CONFIG_DRIVER_BSD=y
CONFIG_DRIVER_NDIS=y
CONFIG_IEEE8021X_EAPOL=y
CONFIG_EAP_MD5=y
CONFIG_EAP_MSCHAPV2=y
CONFIG_EAP_TLS=y
CONFIG_EAP_PEAP=y
CONFIG_EAP_TTLS=y
CONFIG_EAP_GTC=y
CONFIG_EAP_OTP=y
CONFIG_EAP_SIM=y
CONFIG_EAP_AKA=y
CONFIG_EAP_PSK=y
CONFIG_EAP_SAKE=y
CONFIG_EAP_GPSK=y
CONFIG_EAP_PAX=y
CONFIG_EAP_LEAP=y
CONFIG_EAP_IKEV2=y
CONFIG_PCSC=y
EAP-PEAP和EAP-TTLS会自动配置EAP方式(MD5,OTP,GTC,MSCHAPV2)。
创建好配置文件后就可以用make命令编译wpa_supplicant和wpa_cli了。可以将bin文件安装到一个合适的系统目录下,如/usr/local/bin.
示例命令:
#编译wpa_supplicant和wpa_cli
make
#安装bin文件(可能需要root权限)
cp wpa_cli wpa_supplicant /usr/local/bin
需要创建一个配置文件,如/etc/wpa_supplicant.conf,配合当前网络配置。下面配置文件段落有解释配置文件格式和各种示例。配置准备好后,可以通过下面命令在前台运行wpa_supplicant,同时打开debug模式,来测试配置是否正常工作。
wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf –d
假设一切顺利,就可以用下面命令让wpa_supplicant不带debug模式在后台运行。
wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf –B
请注意:如果在.config里包含有多个驱动接口,可以通过-D参数来指定用哪一个接口。看下面段落可以知道更多wpa_supplicant命令行选项的详细信息。
命令行选项
usage:
wpa_supplicant [-BddfhKLqqtuvwW] [-P<pid file>] [-g<global ctrl>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \
[-b<br_ifname> [-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \
[-p<driver_param>] [-b<br_ifname>] ...]
options:
-b = optional bridge interface name
-B = run daemon in the background
-c = Configuration file
-C = ctrl_interface parameter (only used if -c is not)
-i = interface name
-d = increase debugging verbosity (-dd even more)
-D = driver name
-f = Log output to default log location (normally /tmp)
-g = global ctrl_interface
-K = include keys (passwords, etc.) in debug output
-t = include timestamp in debug messages
-h = show this help text
-L = show license (GPL and BSD)
-p = driver parameters
-P = PID file
-q = decrease debugging verbosity (-qq even less)
-u = enable DBus control interface
-v = show version
-w = wait for interface to be added, if needed
-W = wait for a control interface monitor before starting
-N = start describing new interface
drivers:
hostap = Host AP driver (Intersil Prism2/2.5/3) [default]
(this can also be used with Linuxant DriverLoader)
hermes = Agere Systems Inc. driver (Hermes-I/Hermes-II)
madwifi = MADWIFI 802.11 support (Atheros, etc.) (deprecated; use wext)
atmel = ATMEL AT76C5XXx (USB, PCMCIA)
wext = Linux wireless extensions (generic)
ralink = Ralink Client driver
ndiswrapper = Linux ndiswrapper (deprecated; use wext)
broadcom = Broadcom wl.o driver
ipw = Intel ipw2100/2200 driver (old; use wext with Linux 2.6.13 or newer)
wired = wpa_supplicant wired Ethernet driver
roboswitch = wpa_supplicant Broadcom switch driver
bsd = BSD 802.11 support (Atheros, etc.)
ndis = Windows NDIS driver
多数情况下,wpa_supplicant的用法如下:
wpa_supplicant -B -c/etc/wpa_supplicant.conf -iwlan0
该命令会让进程运行在后台。
调试问题和获取问题log的最简单方法是:开启调试模式,在前台运行wpa_supplicant。
wpa_supplicant -c/etc/wpa_supplicant.conf -iwlan0 –d
wpa_supplicant可以控制多个接口,可以通过运行多个进行,每个进程控制一个接口;也可以运行一个进程,用-N参数来将各个接口分开。如下面命令运行两个接口:
wpa_supplicant \
-c wpa1.conf -i wlan0 -D hostap -N \
-c wpa2.conf -i ath0 -D madwifi
如果接口添加到一个linux桥(如 br0),则除了主接口外桥接口也需要配置到wpa_supplicant
wpa_supplicant -cw.conf -Dmadwifi -iath0 -bbr0
配置文件
Wpa_supplicant通过文本文件来配置,该文本文件列出了所有可被接受的网络和安全协议,包括预共享密钥。查看示例文件wpa_supplicant.conf可以获得关于配置格式和支持的东西等更详细的信息。
配置信息有更改的话,可以通过向wpa_supplicant发送SIGHUP信号来重新加载('killall -HUP wpa_supplicant')。同样,重加载可以通过'wpa_cli reconfigure'命令来触发。
配置文件可以包含一个或多个网络块,例如,使用SSID的网络。Wpa_supplicant会根据配置文件里网络块的顺序自动选择最好的网络,以及网络安全等级(WPA/WPA2优先)和信号强度。
一些普通配置示例:
1) WPA-Personal(PSK) 作为家庭网络,带EAP-TLS的WPA-Enterprise作为企业网络。
# 允许’wheel’组所有成员使用前台,如wpa_cli
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
#
# 家庭网络;允许所有合法密码
network={
ssid="home"
scan_ssid=1
key_mgmt=WPA-PSK
psk="very secret passphrase"
}
#
# 企业网络;使用带WPA的EAP-TLS;只允许CCMP和TKIP密码
network={
ssid="work"
scan_ssid=1
key_mgmt=WPA-EAP
pairwise=CCMP TKIP
group=CCMP TKIP
eap=TLS
identity="[email protected]"
ca_cert="/etc/cert/ca.pem"
client_cert="/etc/cert/user.pem"
private_key="/etc/cert/user.prv"
private_key_passwd="password"
}
2) WPA-RADIUS/EAP-PEAP/MSCHAPv2 带有RADUS服务器,使用旧的peaplable(如,Funk Odyssey and SBR, Meetinghouse Aegis, Interlink RAD-Series)
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid="example"
scan_ssid=1
key_mgmt=WPA-EAP
eap=PEAP
identity="[email protected]"
password="foobar"
ca_cert="/etc/cert/ca.pem"
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"
3) EAP-TTLS/EAP-MD5-Challenge 配置成匿名身份,供未加密使用,真实身份只会在加密的TLS通道发送。
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid="example"
scan_ssid=1
key_mgmt=WPA-EAP
eap=TTLS
identity="[email protected]"
anonymous_identity="[email protected]"
password="foobar"
ca_cert="/etc/cert/ca.pem"
phase2="auth=MD5"
}
4) IEEE 802.1X (没有WPA)带动态WEP密钥(需要单播和广播);用EAP-TLS作认证。
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid="1x-test"
scan_ssid=1
key_mgmt=IEEE8021X
eap=TLS
identity="[email protected]"
ca_cert="/etc/cert/ca.pem"
client_cert="/etc/cert/user.pem"
private_key="/etc/cert/user.prv"
private_key_passwd="password"
eapol_flags=3
}
5) 允许近乎所有配置模式的示例.这些配置选项的使用是基于已选择的SSID网络所使用的安全策略。本示例主要用于测试,不建议正常使用。
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid="example"
scan_ssid=1
key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk="very secret passphrase"
eap=TTLS PEAP TLS
identity="[email protected]"
password="foobar"
ca_cert="/etc/cert/ca.pem"
client_cert="/etc/cert/user.pem"
private_key="/etc/cert/user.prv"
private_key_passwd="password"
phase1="peaplabel=0"
ca_cert2="/etc/cert/ca2.pem"
client_cert2="/etc/cer/user.pem"
private_key2="/etc/cer/user.prv"
private_key2_passwd="password"
}
6) 有线以太网认证。可以配合'wired' or 'roboswitch'接口使用(-Dwired or -Droboswitch )。
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
ap_scan=0
network={
key_mgmt=IEEE8021X
eap=MD5
identity="user"
password="password"
eapol_flags=0
}
证书
有些EAP认证方法需要用到证书。EAP-TLS同时使用服务器端和客户端证书,EAP-PEAP和EAP-TTLS只用到服务器端的证书。当使用客户端证书时,一个对应的私有密钥文件必须加到配置里。如果私有密钥使用通关密语,则必须配置到wpa_supplicant.conf(“private_key_passwd”)。用户证书和私有密钥可以包含在同一个文件里。
如果用户证书和私有密钥是以PKCS#12/PFX格式接收到的,需要将它们转化为wpa_supplicant可以接受的PMEM/DER格式。可以用下面命令完成:
# 将客户证书和私有密钥转换成PEM格式
openssl pkcs12 -in example.pfx -out user.pem -clcerts
# 将CA证书(假设是放在pfx文件)转换成PEM格式
openssl pkcs12 -in example.pfx -out ca.pem -cacerts –nokeys
wpa_cli
wpa_cli是基于文本的前台程序,用于与wpa_supplicant交互。主要功能是查询当前状态,更改配置,触发事件,请求交互式用户输入。
Wpa_cli 可以显示当前认证状态,已选择的安全模式,比如dot11和 dot1x MIBs。另外,它还可以配置一些变量像EAPOL状态机参数和触发事件如reassociation,以及IEEE 802.1X注销和登陆。Wpa_cli提供一个用户接口,可查询认证信息,比如用户名和密码。Wpa_cli可用于实现,如一次性密码或通用令牌卡认证,这些认证是基于挑战-响应,响应是由外部设备产生的。
Wpa_supplicant的控制接口可以配置成非root用户访问(配置文件里的ctrl_interface_group)。这样就可以在普通帐号下运行wpa_cli了。
Wpa_cli支持两种模式:交互式和命令行。两种模式使用同样的命令集,它们的主要差别是交互式模式可以访问自主提供的消息(事件消息,需要用户名/密码)。
当Wpa_cli没带命令行参数执行时,就是交互式模式。命令是在命令行模式里的wpa_cli提示符下输入,输入命令的功能是与wpa_cli所带的命令行参数是一样的。
交互式认证参数需求
当wpa_supplicant需要认证参数时,比如用户名和密码,如果配置文件里没有的话,就会向所有前台程序发送请求信息。如果是在交互式模式下,wpa_cli会显示下面的请求信息:
"CTRL-REQ-<type>-<id>:<text>"
<type> is IDENTITY, PASSWORD, or OTP (one-time-password).
<id> is a unique identifier for the current network.
<text> is description of the request. In case of OTP request, it includes the challenge from the authentication server.
这些请求的答复可以'身份','密码',“OTP”命令。<id>需要从匹配的请求中复制。'密码',“OTP”命令的可以使用可以不理会该请求是否为密码或者OTP。这两者的主要区别是只要wpa_supplicant运行着,密码值就会一直被记住,而otp的值是用完就忘,比如,每次使用时,wpa_supplicant会要求前端给一个新值。这样就可以用于操作一次性密码表和基于认证的通用令牌卡。
请求密码和匹配的应答示例
CTRL-REQ-PASSWORD-1:Password needed for SSID foobar
> password 1 mysecretpassword
请求通用令牌卡挑点-应答示例
CTRL-REQ-OTP-2:Challenge 1235663 needed for SSID foobar
> otp 2 9876
wpa_cli 命令
status = get current WPA/EAPOL/EAP status
mib = get MIB variables (dot1x, dot11)
help = show this usage help
interface [ifname] = show interfaces/select interface
level <debug level> = change debug level
license = show full wpa_cli license
logoff = IEEE 802.1X EAPOL state machine logoff
logon = IEEE 802.1X EAPOL state machine logon
set = set variables (shows list of variables when run without arguments)
pmksa = show PMKSA cache
reassociate = force reassociation
reconfigure = force wpa_supplicant to re-read its configuration file
preauthenticate <BSSID> = force preauthentication
identity <network id> <identity> = configure identity for an SSID
password <network id> <password> = configure password for an SSID
pin <network id> <pin> = configure pin for an SSID
otp <network id> <password> = configure one-time-password for an SSID
passphrase <network id> <passphrase> = configure private key passphrase
for an SSID
bssid <network id> <BSSID> = set preferred BSSID for an SSID
list_networks = list configured networks
select_network <network id> = select a network (disable others)
enable_network <network id> = enable a network
disable_network <network id> = disable a network
add_network = add a network
remove_network <network id> = remove a network
set_network <network id> <variable> <value> = set network variables (shows
list of variables when run without arguments)
get_network <network id> <variable> = get network variables
save_config = save the current configuration
disconnect = disconnect and wait for reassociate command before connecting
scan = request new BSS scan
scan_results = get latest scan results
get_capability <eap/pairwise/group/key_mgmt/proto/auth_alg> = get capabilies
terminate = terminate wpa_supplicant
quit = exit wpa_cli
wpa_cli 命令行选项
wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] [-a<action file>] \
[-P<pid file>] [-g<global ctrl>] [command..]
-h = help (show this usage text)
-v = shown version information
-a = run in daemon mode executing the action file based on events from
wpa_supplicant
-B = run a daemon in the background
default path: /var/run/wpa_supplicant
default interface: first interface found in socket path
在连接/断开的状态下,可以使用wpa_cli运行外部程序
Wpa_cli 可以用于运行外部程序,不管wpa_supplicant是否与网络连接或断开。可以用于,比如,更新网络配置,或者触发DHCP客户端更新IP地址等。
每个接口都需启动一个处于活动状态的wpa_cli进程。例如,下面命令会为默认接口启动wpa_cli(如果有多个接口存在时,-i可以用于选择接口):
wpa_cli -a/sbin/wpa_action.sh –B
一旦wpa_supplicant完成认证就会执行操作文件(-a选项,如例子中的/sbin/wpa_action.sh)。带两个命令行参数的操作脚本会被调用:接口名称和事件(连接或断开)。如果操作脚本需要获取当前网络的更多信息,可以使用’wpa_cli status’查询wpa_supplicant来获取更多的信息。
下面例子可以作为操作脚本的一个简单范本:
#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" == "CONNECTED" ]; then
SSID=`wpa_cli -i$IFNAME status | grep ^ssid= | cut -f2- -d=`
# configure network, signal DHCP client, etc.
fi
if [ "$CMD" == "DISCONNECTED" ]; then
# remove network configuration, if needed
Fi
结合pcmcia-cs/cardmgr脚本
当使用一个带WPA的无线网络时,需要运行wpa_supplicant,可以通过系统启动脚本运行或者通过pcmcia-cs/cardmgr脚本(当使用PC卡时)运行。在数据帧交换前,必须完成WPA握手,因此wpa_supplicant应在DHCP客户端之前启动。
例如,下面对pcmcia-cs脚稍微改动就可以启动对WPA的支持:
修改/etc/pcmcia/wireless.opts.,对network scheme添加MODE="Managed"和WPA="y"
将下面字块添加到/etc/pcmcia/wireless里的'start'段后面:
if [ "$WPA" = "y" -a -x /usr/local/bin/wpa_supplicant ]; then
/usr/local/bin/wpa_supplicant -B -c/etc/wpa_supplicant.conf \
-i$DEVICE
fi
将下面字块添加至/etc/pcmcia/wireless里的’stop’段后面(可能需要和其他段分开):
if [ "$WPA" = "y" -a -x /usr/local/bin/wpa_supplicant ]; then
killall wpa_supplicant
fi
这样,当卡插入时,cardmgr就会启动wpa_supplicant.
动态接口添加和操作无需配置文件
---------------------------------------------------------------
以不用配置文件或者网络接来去启动wpa_supplicant。当使用这个方法时,一个全局控制接口可用于添加或删除网络接口。每个网络接口就可以通过一个per-network interface控制接口来配置。例如,下面命令显示不带网络接口来启动wpa_supplicant,然后添加一个网络接口,并配置一个网络(SSID):
# Start wpa_supplicant in the background
wpa_supplicant -g/var/run/wpa_supplicant-global -B
# Add a new interface (wlan0, no configuration file, driver=wext, and
# enable control interface)
wpa_cli -g/var/run/wpa_supplicant-global interface_add wlan0 \
"" wext /var/run/wpa_supplicant
# Configure a network using the newly added network interface:
wpa_cli -iwlan0 add_network
wpa_cli -iwlan0 set_network 0 ssid '"test"'
wpa_cli -iwlan0 set_network 0 key_mgmt WPA-PSK
wpa_cli -iwlan0 set_network 0 psk '"12345678"'
wpa_cli -iwlan0 set_network 0 pairwise TKIP
wpa_cli -iwlan0 set_network 0 group TKIP
wpa_cli -iwlan0 set_network 0 proto WPA
wpa_cli -iwlan0 enable_network 0
# At this point, the new network interface should start trying to associate
# with the WPA-PSK network using SSID test.
# Remove network interface
wpa_cli -g/var/run/wpa_supplicant-global interface_remove wlan0
权限分离
需要运行在root权限下才可以尽量减少代码大小(例如控制无线接口操作),wpa_supplicant支持可选的权限分离。如果启动了该功能,就会将需要特权的操作分进一个单独的进程(wpa_priv),将其他的代码(比如,EAP认证和WPA握手 )分进不需要root权限的进程(wpa_supplicant)。权限分离限制了潜在的软件错误的影响,大部分的代码包含在一个非特权进程,以避免全系统妥协。
权限分离默认是不启动的,可以通过在.config文件里添加CONFIG_PRIVSEP=y来打开。当启动后,特权操作就会连接到一个“守护”程序,wpa_priv。非特权进程,wpa_supplicant,会建成一个特殊的驱动与特权进程wpa_priv进行沟通来执行所需的操作。Wpa_priv可以控制权限所允许的任何东西。
Wpa_priv需要网络管理员权限来运行。它会为每个接口开一个UNIX域socket;其他接口会对wpa_supplicant限制。
配置示例:
- create user group for users that are allowed to use wpa_supplicant
('wpapriv' in this example) and assign users that should be able to
use wpa_supplicant into that group
- create /var/run/wpa_priv directory for UNIX domain sockets and control
user access by setting it accessible only for the wpapriv group:
mkdir /var/run/wpa_priv
chown root:wpapriv /var/run/wpa_priv
chmod 0750 /var/run/wpa_priv
- start wpa_priv as root (e.g., from system startup scripts) with the
enabled interfaces configured on the command line:
wpa_priv -B -P /var/run/wpa_priv.pid wext:ath0
- run wpa_supplicant as non-root with a user that is in wpapriv group:
wpa_supplicant -i ath0 -c wpa_supplicant.conf
在wpa_supplicant启动前,wpa_priv不会使用网络接口,因此在wpa_priv启动时加入网络接口不会出问题。换种说法,添加一个接口和启动wpa_priv可同时进行。Wpa_priv可以在一个进程里同时控制多个接口,如果想要的话,也可以同时运行多个wpa_priv进程。