wpa_supplicant无线网络配置

来源:互联网 发布:文武学校 知乎 编辑:程序博客网 时间:2024/06/06 07:30

wifi连接有一些阶段:但是还没了解他们的具体协议内容。

        1、AP定期发送beacon数据包,使无线终端更新自己的无线网络列表。

  ‍‍2、无线终端在每个信道(1-13)广播ProbeRequest(非隐藏类型的WiFi含ESSID,隐藏类型的WiFi不含ESSID)。‍‍

  ‍‍3、每个信道的AP回应,ProbeResponse,包含ESSID,及RSN信息。‍‍

  ‍‍4、无线终端给目标AP发送AUTH包。AUTH认证类型有两种,0为开放式、1为共享式(WPA/WPA2必须是开放式)。‍‍

  ‍‍5、AP回应网卡AUTH包。‍‍

  ‍‍6、无线终端给AP发送关联请求包associationrequest数据包。‍‍

  ‍‍7、AP给无线终端发送关联响应包associationresponse数据包。‍‍

  ‍‍8、EAPOL四次握手进行认证(握手包是破解的关键)。‍‍

  ‍‍9、完成认证可以上网。

4次握手如下:

1、当一个无线客户端与一个无线AP连接时,先发出连接认证请求(握手申请:你好!)
2、无线AP收到请求以后,将一段随机信息发送给无线客户端(你是?)AP发送一个随机数组给AP
3、无线客户端将接收到的这段随机信息进行加密之后再发送给无线AP (这是我的名片)STA用PSK将数据进行加密发送给STA。PSK通过AP的SSID和PASSWORD生成的。
4、无线AP检查加密的结果是否正确,如果正确则同意连接 (哦~ 原来是自己人呀!)AP判断加密是否正确。


关于wpa_supplicant的P2P功能:http://w1.fi/wpa_supplicant/devel/p2p.html

wpa_supplicant就是用来扫面AP和连接AP的。
参考:http://blog.sina.com.cn/s/blog_55465b470100l73l.html
启动服务器:
/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -O /var/run/wpa_supplicant
源码有解析:-B后台运行,-P将pid(进程ID)写到指定文件,-u启动DBus控制接口,-s将log写到syslog,-O通讯文件/var/run/wpa_supplicant,目录有个wlan0。-i指定网卡。

/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -iwlan0 -c/var/run/wpa_supplicant/con.conf
-c指定配置文件。配置文件:
#这里等于-O /var/run/wpa_supplicant,wpa_cli需要用到,ctrl_interface=/var/run/wpa_supplicant是一个目录,然后wpa_supplicant_add_iface调用wpa_supplicant_init_iface调用wpa_supplicant_ctrl_iface_init调用wpas_ctrl_iface_open_sock,将会组合/var/run/wpa_supplicant/wlan0.wlan0是-i参数。/var/run/wpa_supplicant/wlan0用来与wpa_cli通讯SOCKET用的。
ctrl_interface=/var/run/wpa_supplicant/
update_config=1


WPA_SUPPLICANT简单理解:源码main.c是入口,假设用epoll,其实一般用的是select。

1.wpa_supplicant_init将运行时的参数配置进全局structor中,并调用eloop_init>>epoll_create1。

2.wpa_supplicant_add_iface添加interface,如wlan0数据。调用wpa_supplicant_init_iface-》wpa_config_read读取-c文件内容,->wpa_supplicant_ctrl_iface_init->wpas_ctrl_iface_open_sock->wpa_supplicant_ctrl_iface_path(获得通讯地址文件)建立unix socket(/var/run/wpa_supplicant/wlan0),eloop_register_read_sock调用epoll_ctrl注册通讯的读取事件。并注册回调函数wpa_supplicant_ctrl_iface_receive用以接收wpa_cli命令。wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);注册回调函数,用以发送msg到wpa_cli。

3. wpa_supplicant_run->eloop_run处理超时/读写/信号。其中 epoll_wait接收wpa_ctrl通讯(写事件),通过eloop_sock_table_dispatch回调函数wpa_supplicant_ctrl_iface_receive处理。最终处理函数一般进wpa_supplicant_ctrl_iface_process



启动客服端:
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant
-p指定与wpa_supplicant通讯的文件。UNIX_SOCK.
1.扫描AP
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan
2.打印扫描结果:6c:b0:ce:bd:d0:b3(mac)    2462(frequency)    -43(signal)    [WPS][ESS](加密方式)    Ocean-2.4G(ssid)
加密方式有:open和[WPS][ESS]都可以用key_mgmt NONE来连接,
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP].PSK:Pre-Shared Key (clear or encrypted)预共享秘钥。设置key_mgmt为WPA-PSK,pairwise(Pairwise ciphers for WPA)配置为CCMP TKIP
[WPA-EAP-CCMP+TKIP][WPA2-EAP-CCMP+TKIP][ESS].EAP扩展认证协议
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result
3.添加网络接口。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network
4.向网络接口0添加AP的SSID,用于连接。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Ocean-2.4G"'  ###注意'""'
5.key_mgmt秘钥类型管理。
如果是OPEN:秘钥([WPS][ESS]    Ocean-2.4G)。
WEP:模式key_mgmt NONE,有wep_key0设置密码。
WPA-PSK:就要key_mgmt WPA-PSK设置psk密码,
WPA-EAP:就要key_mgmt WPA-EAP可能还要选择加密类型eap(MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS),EAP identity string和password.EAP用的比较少。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt NONE
6.启动接口0,去连接AP。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0
7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
查看状态结果:
bssid=6c:b0:ce:bd:d0:b3
ssid=Ocean-2.4G
id=0
mode=station
pairwise_cipher=NONE
group_cipher=NONE
key_mgmt=NONE
wpa_state=COMPLETED
ip_address=192.168.6.103
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410
8.sudo udhcpc -iwlan0
去AP网络dhcp服务器取得动态IP。

注:udhcpc分配IP成功了,该进程就没用了,可以kill掉。更多关于udhcpc用法参考:http://blog.csdn.net/hxchuan000/article/details/47810229

Sending discover...如果失败会一直discover。
Sending select for 192.168.43.180...成功分配IP。。。。

--------------sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant select_network 0
切换本地网络接口。



连接WPA_PSK网络:

1.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
状态结果:
wpa_state=INTERFACE_DISABLED
ip_address=192.168.6.103
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410

2.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan
OK
3.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result
查看要连接的AP
76:04:2b:60:43:74    2442    -32    [WPA2-PSK-CCMP][WPS][ESS]    Lenovo K50-T5
4.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network
添加网络接口。
5.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Lenovo K50-T5"'        ###注意'""'
添加AP的SSID
6.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt WPA-PSK
加密方式WPA_PSK
7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 psk '"4da886c21a9c"'
添加psk密码。
8.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0
使能网络。
9.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
结果:
bssid=76:04:2b:60:43:74
ssid=Lenovo K50-T5
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410
10.sudo udhcpc -iwlan0
去AP网络dhcp服务器取得动态IP。
Sending discover...如果失败会一直discover。
Sending select for 192.168.43.180...成功分配IP。。。。

这样就链接到AP了,可以通过他来连接到外网。udhcpc的用法之前有说过,用自己的脚本来实现ip配置。


而我们一般都是将这些配置写到wap_supplicant的配置文件里面:
ctrl_interface=DIR=/data/system/wpa_supplicant
GROUP=system
update_config=1
network={
ssid="AP ssid"
proto=WPA
key_mgmt=WPA-PSK
#psk="ap password"

psk=f161f2018e3b0f5dbe055360ea89eba0c0c014840b1e0091a99774222a61fa60

#psk是通过wpa_passphrase使用SSID和PASSWORD共同生成的

pairwise=CCMP TKIP(如果有的话,CCMP TKIP都是加密算法)
group=CCMP TKIP
}

启动wpa_supplicant就运行起来了。

=============================================================================

=============================================================================

分割线,参考资料:

=============================================================================

=============================================================================

目前可以使用wireless-toolswpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。

wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPAAP

经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicantwpa_cliwpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

如何用wpa_supplicant使能一个wifi连接?

Stepby step

1、运行wpa_supplicant程序;

执行:/system/bin/wpa_supplicant-d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf

其中:

-d:增加调试信息

-Dwextwext,驱动名称

-iwlan0wlan0,网络接口名称

/system/bin/wpa_supplicantwpa_supplicant可执行程序path

/data/misc/wifi/wpa_supplicant.confwpa_supplicant的配置文件path

2、运行命令行工具wpa_cli

执行:wpa_cli-iwlan0 -p/data/system/wpa_supplicant

注,-p/data/system/wpa_supplicant中的wpa_supplicant并不是可执行程序,而是个控制套接字。

此时会进入交互模式。其中交互模式的命令如下表:

Fullcommand

Shortcommand

Description

status

stat

displaysthe current connection status

disconnect

disc

preventswpa_supplicant from connecting to any access point

quit

q

exitswpa_cli

terminate

term

killswpa_supplicant

reconfigure

recon

reloadswpa_supplicant with the configuration file supplied (-c parameter)

scan

scan

scansfor available access points (only scans it, doesn't displayanything)

scan_result

scan_r

displaysthe results of the last scan

list_networks

list_n

displaysa list of configured networks and their status (active or not,enabled or disabled)

select_network

select_n

selecta network among those defined to initiate a connection (ieselect_network 0)

enable_network

enable_n

makesa configured network available for selection (ie enable_network 0)

disable_network

disable_n

makesa configured network unavailable for selection (ie disable_network0)

remove_network

remove_n

removesa network and its configuration from the list (ie remove_network0)

add_network

add_n

addsa new network to the list. Its id will be created automatically

set_network

set_n

showsa very short list of available options to configure a network whensupplied with no parameters.

Seenext section for a list of extremely useful parameters to be usedwith set_network and get_network.

get_network

get_n

displaysthe required parameter for the specified network. See next sectionfor a list of parameters

save_config

save_c

savesthe configuration


设置网络的基本格式:set_network<network id> <key> <parameter> [<parameter>]

显示网络信息的基本格式:get_network<network id> <key>

相应的参数如下表:

Key

Description

Parameters

ssid

Accesspoint name

string

id_str

Stringidentifying the network

string

priority

Connectionpriority over other APs

number(0 being the default low priority)

bssid

Macaddress of the access point

macaddress

scan_ssid

Enable/disbalessid scan

0,1, 2

key_mgmt

Typeof key management

WPA-PSK,WPA_EAP, None

pairwise

Pairwiseciphers for WPA

CCMP,TKIP

group=TKIP

Groupciphers for WPA

CCMP,TKIP, WEP104, WEP40

psk

Pre-SharedKey (clear or encrypted)

string

wep_key0

WEPkey (up to 4: wep_key[0123])

string

eap

ExtensibleAuthentication Protocol

MD5,MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS

identity

EAPidentity string

string

password

EAPpassword

string

ca_cert

Pathnameto CA certificate file

/full/path/to/certificate

client_cert

Pathnameto client certificate

/full/path/to/certificate(PEM/DER)

private_key

Pathnameto a client private key file

/full/path/to/private_key(PEM/DER/PFX)

eg.1、连接无加密的AP

>add_network(It will display a network id for you, assume it returns 0)

>set_network0 ssid "666"

>set_network0 key_mgmt NONE

>enable_network0

>quit

eg.2、连接WEP加密AP

>add_network(assume return 1)

>set_network1 ssid "666"

>set_network1 key_mgmt NONE

>set_network1 wep_key0 "your ap password"

>enable_network1

eg.3、连接WPA-PSK/WPA2-PSK加密的AP

>add_network(assume return 2)

>set_network2 ssid "666"

>set_network2 psk "your pre-shared key"

>enable_network2

到此,wifi模块就能连接上AP了。

3、以上是通过命令行工具wpa_cli来实现wifi网络的连接。当然,也可以通过wpa_supplicant的配置文件来实现连接。

再回顾下运行wpa_supplicant时执行的命令:

/system/bin/wpa_supplicant-d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf

我们在执行时加上了-c/data/misc/wifi/wpa_supplicant.conf,我们可以将我们要连接的AP的设置以一定的格式写入wpa_supplicant.conf配置文件中即可。

eg.

ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=system update_config=1

network={

ssid="myaccess point"

proto=WPA

key_mgmt=WPA-PSK

psk="youpass words"

}


0 0