wpa_supplicantの存在

Wireless LAN製品の開発(使用)をする場合、サプリカント機能としてwpa_supplicantを使用することが多いと思います。

実際に、私が担当しているクアルコム社のWi-Fi製品でもwpa_supplicantをリファレンスとして使用しています。

「supplicant」の意味を検索すると「請願者・嘆願者」などと出てきます。文字通りwpa_supplicantは、”WPA認証の請願者”となります。つまり、client側からAP(アクセスポイント)に対して接続を請願するソフトウェアです。

 

wpa_supplicantを使用している環境の製品サポートをしていると、wpa_supplicantの設定により接続できないケースがたびたびあります。

そこで今回はwpa_supplicantの使い方を紹介していきます。

wpa_supplicantとは?

wpa_supplicantは、IEEE802.1X/WPA サプリカント機能を提供するフリーソフトウェアでありオープンソースソフトウェアです。

様々なOSやドライバーに対応しており、ユーザーインターフェースもCUI/GUIに対応しています。

以前までは、wpa_supplicantという名前のソフトウェアパッケージでしたが、現在はhostapとなっており、その中のwpa_supplicantモジュールとなっています。

※ AP機能としてhostapdというモジュールも存在します。

環境について

今回、使用する環境はUbuntu16.04+Kernel4.9.11+QCA9377(Qualcomm Wireless LAN製品)の組み合わせになります。

wpa_supplicantの使い方

wpa_supplicantは、内部にAPの情報を設定することでAPへ接続します。

接続の流れとしては、

1.wpa_supplicantの起動

2.ネットワークブロック(AP情報)の登録

3.Scanの実行

4.発見したAPへ接続

となります。

 

wpa_supplicantは、ユーザーインターフェース(CUI/GUI)で操作することが可能です。

あらかじめ、wpa_supplicant.confファイルにネットワークブロックを書いておくことで、wpa_supplicantを起動するだけで接続させることが可能ですが、ユーザーインターフェースを使用することで、ネットワークブロックを追加したり、接続/切断、接続先の切り替え、WPSでの接続など動的な処理も可能です。

wpa_supplicantの起動

まず、wpa_supplicantの設定ファイルを準備します。

今回は設定するパラメータを説明しながら進めます。

以下、最低限必要と思われる設定ファイル(wpa_supplicant.conf(名前は任意))の中身になります。

ctrl_interface=/var/run/wpa_supplicant <= ユーザーインターフェスのために使用するsocketの指定です。wpa_supplicant起動時の”C”オプションでも指定可能です。ない場合外部からのコントロールができません。
country=JP <= 設定されていない場合、意図しないカントリーコードの設定で動作してしまいます。

wpa_supplicant.conf作成後、ドライバーをロードし、インターフェース名を確認します。

ドライバーのロード前後のiwconfigの結果を確認すればインターフェース名がわかります。

以下の例ではwlan0とp2p0ができていますが、wlan0がclientモード用のインターフェース名になります。p2p0はP2Pモード用になります。

インターフェース名が確認できたのでwpa_supplicantを起動します。(要root権限)

wpa_supplicant -iwlan0 -Dnl80211 -c/home/root/wpa_supplicant.conf -ddd


’i’オプション:インターフェース名=>wlan0

’D’オプション:使用するドライバー=>nl80211(使用する無線LANデバイスにより変わります)

’c’オプション:設定ファイルのパス=>/home/root/wpa_supplicant.conf

'd'オプション:ログレベルを変更します。デフォルトが”MSG_INFO”で'd'の数だけ数値が減ります。”-ddd”で”MSG_EXESSIVE”になります。

MSG_EXCESSIVE < MSG_MSGDUMP < MSG_DEBUG < MSG_INFO < MSG_WARNING < MSG_ERROR

”Successfully initialized wpa_supplicant”が表示されれば起動成功です。

test@test-ThinkPad-T430:~# iwconfig
lo        no wireless extensions.
eth0      no wireless extensions.
test@test-ThinkPad-T430:~# insmod wlan.ko
test@test-ThinkPad-T430:~# iwconfig
p2p0      Qcom:802.11n  ESSID:off/any  Nickname:""
          Channel:0  Access Point: Not-Associated   Bit Rate:0 kb/s
          Tx-Power=off
          RTS thr:off   Fragment thr:off
          Encryption key:off
lo        no wireless extensions.
eth0      no wireless extensions.
wlan0     Qcom:802.11n  ESSID:off/any  Nickname:""
          Channel:0  Access Point: Not-Associated   Bit Rate:0 kb/s
          Tx-Power=off
          RTS thr:off   Fragment thr:off
          Encryption key:off
test@test-ThinkPad-T430:~# wpa_supplicant -iwlan0 -Dnl80211 -c ~/wpa_supplicant.conf &
test@test-ThinkPad-T430:~# Successfully initialized wpa_supplicant

さて、起動はしてみましたが設定ファイルの中は、ctrl_interfaceとcountry以外記載がありません。

これでは、wpa_supplicantは起動しているだけの状態です。

ここからいろいろ触っていきましょう。

wpa_cliの起動

まずは、CUIをインタラクティブモードで起動していきます。(要root権限)

wpa_cli -iwlan0 -p/ver/run/wpa_supplicant

’i’オプション:インターフェース名=>wlan0

’p’オプション:コントロールインターフェースのパス=>/var/run/wpa_supplicant(wpa_supplicant.confに記載のctrl_interfaceの設定値)

test@test-ThinkPad-T430:~# wpa_cli -iwlan0 -p/var/run/wpa_supplicant
wpa_cli v2.10-devel-hostap_2_9-2307-g7b65003+
Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.
Interactive mode
>

スキャンの実行

スキャンを実行しスキャン結果(見つかったAPのリスト)を表示します。

scan:Scanを実行します。

scan_results:Scan結果を表示します。

> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-NETWORK-NOT-FOUND
> scan_results
bssid / frequency / signal level / flags / ssid
11:22:33:44:55:66       5180    -39     [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] test

ネットワークブロックの作成

スキャン結果とAPの設定情報をもとにネットワークブロックを作成します。

add_network:空のネットワークブロックを作成します。

set_network <network ID> <parameter> <value>:ネットワークブロックにパラメーターを設定します。

    parameter:

        ssid:APのssidをダブルコート””で囲んで入力します。

        psk:APのパスフレーズをダブルコート””で囲んで入力します。

        key_mgmt:キーマネージメント対応を入力します。(NONE(オープン)/WPA-PSK/SAEなど)

list_networks:登録しているネットワークブロックを表示します。

save_config:登録したネットワークブロックをwpa_supplicant.confに保存します。セーブしなかった場合、wpa_supplicant終了時に追加したネットワークブロックが消えます。

> add_network
0
<3>CTRL-EVENT-NETWORK-ADDED 0 <= 作成したネットワークブロックにID=0が付与されました。以降このIDでネットワークブロックにアクセスします。
> set_network 0 ssid "test" <= ID=0のネットワークブロック対して、ssidを”test”に設定します。
OK
> set_network 0 psk "12345678" <= ID=0のネットワークブロック対して、pskを”12345678”に設定します。
OK
> set_network 0 key_mgmt WPA-PSK <= ID=0のネットワークブロック対して、key_mgmtをWPA-PSKに設定します。スキャン結果の[WPA-PSK-CCMP][WPA2-PSK-CCMP]よりWPA/WPA2対応APなのでWPA-PSKを設定します。protoでWPA(RSN)を指定するとWPA(RSN)で接続します。設定しない場合RSNを優先して設定します。
OK
>save_config

wpa_supplicant.confにネットワークブロックを記載する場合は、以下のように記載します。

上記コマンドで作成したネットワークブロックです。

network={

    ssid="test"

    psk="12345678"

    key_mgmt=WPA-PSK

}


ちなみに、上記設定にないパラメータはデフォルト値もしくはサポートされているよりセキュアなものが使用されます。

例:

proto:RSN(WPA2) > WPA

pairwise chipher:CCMP > TKIP

group chipher:CCMP > TKIP

接続

作成したネットワークブロックで接続します。

ネットワークブロックの状態としては、有効(何もなし)/一時的に無効([TEMP-DISABLED])/無効([DISABLED])/選択状態(CURRENT)のどれかになります。

それぞれの状態:

有効(何もなし):[CURRENT]のネットワークが接続できない状態(電波を受信できない状態)になったときの接続対象

一時的に無効([TEMP-DISABLED]):パスワード間違いなどで接続に失敗しRetry中の状態

無効([DISABLED]):非接続対象

選択状態(CURRENT):接続対象

 

ネットワークブロックを作成しただけでは、「DISABLED」の状態ですので有効にし、必要であれば選択します。

”enable_network <ID>”:ネットワークブロックを有効にします。

”select_network <ID>”:ネットワークブロックを選択します。

未接続の場合
> list_networks <= ネットワークブロックの一覧を表示します。
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
> enable_network 0 <= 作成したネットワークブロックを有効にします。
====== 接続処理 =====
> list_networks
network id / ssid / bssid / flags
0       test1    any     [CURRENT] <= 有効になった後接続処理が実行され選択状態になります。
既に他のAPへ接続積みの場合:
> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
1       test2    any     [CURRENT]
> enable_network 0
> list_networks
network id / ssid / bssid / flags
0       test1    any
1       test2    any     [CURRENT] <= ID'0'は有効になるが接続先は変わらず
> select_network 0 <= 選択先を'0'に変更します。
====== 接続処理 =====
> list_networks
network id / ssid / bssid / flags
0       test1    any     [CURRENT] <= '0'が選択先になります。
1       test2    any     [DISABLED]

切断/再接続

切断し再度接続する場合は、以下のコマンドを実行します。

disconnect:接続中のAPから切断します。ネットワークブロックは削除されません。

reconnect:有効状態のネットワークに再接続します。

> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
1       test2    any     [CURRENT]
> disconnect
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=3 locally_generated=1
> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
1       test2    any
> reconnect
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
> wlan0: Trying to associate with SSID 'test2'
<3>Trying to associate with SSID 'test2'
> wlan0: Associated with 98:de:d0:af:9f:1d
<3>Associated with 98:de:d0:af:9f:1d
> wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
<3>WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
1       test2    any     [CURRENT]
>

ネットワークブロックの削除

ネットワークブロックを削除する場合は、以下のコマンドを実行します。

remove_network <ID>

切断後ネットワークブロックを削除します。

> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
1       test2    any     [CURRENT]
> remove_network 1
<3>CTRL-EVENT-NETWORK-REMOVED 1
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=3 locally_generated=1
> list_networks
network id / ssid / bssid / flags
0       test1    any     [DISABLED]
> save_config <= wpa_supplicantconfを更新します。

WPSでの接続

ネットワークブロックを作成しなくともWPSで接続することも可能です。

ここでは、APでよく使用されるpush buttonについて記載します。

wps_pbc:push buttonを使用してANY接続します。

wps_pbc <bssid>:push buttonを使用して<bssid>のAPへ接続します。

wps_cancel:実行中のWPSの処理をキャンセルします。

> wps_pbc
wlan0: WPS-PBC-ACTIVE
OK
<3>CTRL-EVENT-NETWORK-ADDED 1
<3>WPS-PBC-ACTIVE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
> wlan0: Trying to associate with 98:de:d0:af:9f:1d (SSID='TP-LINK_9F1D_5G' freq=5200 MHz)
<3>Trying to associate with 98:de:d0:af:9f:1d (SSID='TP-LINK_9F1D_5G' freq=5200 MHz)
> wlan0: Associated with 98:de:d0:af:9f:1d
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>Associated with 98:de:d0:af:9f:1d
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STATUS status='started' parameter=''
> wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
wlan0: CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
<3>CTRL-EVENT-EAP-STATUS status='accept proposed method' parameter='WSC'
<3>CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
> wlan0: WPS-CRED-RECEIVED
<3>WPS-CRED-RECEIVED
> wlan0: WPS-SUCCESS
<3>WPS-SUCCESS
> wlan0: CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=8
<3>CTRL-EVENT-DISCONNECTED bssid=98:de:d0:af:9f:1d reason=8
> wlan0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
<3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
> wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
<3>CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>CTRL-EVENT-NETWORK-NOT-FOUND
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
> wlan0: Trying to associate with SSID 'TP-LINK_9F1D_5G'
<3>Trying to associate with SSID 'TP-LINK_9F1D_5G'
> wlan0: Associated with 98:de:d0:af:9f:1d
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>Associated with 98:de:d0:af:9f:1d
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> wlan0: WPA: Key negotiation compl[  177.273055] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
eted with 98:de:d0:af:9f:1d [PTK=CCMP GTK=TKIP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
<3>WPA: Key negotiation completed with 98:de:d0:af:9f:1d [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to 98:de:d0:af:9f:1d completed [id=1 id_str=]
>

まとめ

今回はwpa_supplicantの基本的な使い方を説明してきました。

次回はhostapdの基本的な使い方について説明しようと思います。


クアルコム社のWi-Fi製品は、リファレンスとしてLinux+wpa_supplicant/hostapdに対応しております。製品へのご興味もございましたら、下記よりお問い合わせをお願い致します。

お問い合わせ

Qualcomm製品に関するご質問等がございましたら、以下リンクよりお問い合わせください。

Qualcomm メーカー情報Topへ

Qualcomm メーカー情報Topページへ戻りたい方は、以下をクリックしてください。