Wi-Fi Easy Connectのはなし
IEEE 802.11-1997から28年・Wi-Fi Allianceの結成から26年経って無線LAN規格も成熟し、「Wi-Fi」は職場や家庭にあって当たり前・動いて当たり前というほどに普及して、目新しい話は少なくなってきました。IEEE802.11サブグループもWi-Fi Allianceも新企画を打ち出してはいるのですが、不発が多くなっています。今回はそんな存在感の薄い新企画のひとつ、Wi-Fi Easy Connect™(※註)のはなしです。
(※註) Wi-Fi Allianceの登録商標なので(TM)を付けるのが正式な表記ですが、本文中では表題以外では省略しています。
Wi-Fi Easy Connectとは
Wi-Fi Easy Connectは、WPS(Wi-Fi Protected Setup)に代わる新しい「かんたん設定」方式として企画され、仕様書の初版は2018年4月にリリースされました。Device Provisional Protocolの略でDPPとも呼ばれます(※註)。WPSが「ボタンを押すタイミング」などを用いていたのに対し、Easy ConnectはECDH鍵共有方式を積極的に採用し、その交換にはスマートフォンを活用することが考慮されています。なおEasy Connectではスマートフォンに代表される設定役デバイスのことを「コンフィギュレーター (Configurator)」と呼び、「コンフィギュレーターによって設定されるノード」を「エンローリー (Enrollee)」と呼びます。
(※註) 厳密に言えばDPPはWi-Fi Easy Connect仕様の一部分なのですが、詳細については割愛します。
Easy Connectのユースケースをものすごく大雑把に解説すると下記のようになります。
(1) Easy Connect対応製品は筐体や製品パッケージに固有のQRコードを持っている。スマートフォンの設定アプリでQRコードを撮影して取り込み登録する。この操作を「ブートストラップ」と呼ぶ。
(2) 設定アプリに「デバイスに設定したい情報」を登録する。例えば既にレガシーモードで動いているWi-Fi環境があるなら、SSID・WPAモード・パスフレーズ/パスワードなどの情報を手動設定する。
(3) 登録した製品に対してQRコードで暗号化された無線設定を「プッシュ」する。
(4) 再起動すればプッシュした設定で接続する(はず)。
Easy Connectの仕様上は、スマートフォンに限らずAP/STAがコンフィギュレーターを兼用することも可能だし、QRコード以外にも公開鍵(PKEX)・NFC・BLEによる設定手段もあり、WPS上位互換となるプッシュボタン仕様もあり、Easy Connect 2.0以後では有線ネットワークを介した遠隔設定(DPP over TCP)も追加されています。しかし「あれもできる・これもできる」と風呂敷を広げすぎて「結局何がどう便利になるのかよくわからん」になってしまった印象もあります。
LegacyモードでのEasy Connect設定・動作例
まずもっとも単純な例として、「WPA2-PSKで動作している既存APの設定を、第三者のコンフィギュレーターを用いて、初期状態のSTAにプッシュする」シナリオを作ってみます。そのために3台のWi-Fiノードが必要になります。無線LANの付いているLinux PCを3台用意して1台をAP役・1台をSTA役・1台をスマートフォンがわりのコンフュギュレーター役に見立てました。
実験にはUbuntu Linux 20.04標準のwpa_supplicant v2.9とhostpapd v2.9を使いました。プラットホームによってはCONFIG_DPP=yでビルドされていないかもしれません。その場合はgit clone git://w1.fi/srv/git/hostap.gitで最新ソースコードをチェックアウトして、hostapd/wpa_supplicantの.configのCONFIG_DPP=yに設定してビルドしてください。
Ubuntu Desktopではデフォルト状態でネットワークマネージャーがネットワークインターフェースを統括しているので、以下のコマンドでネットワークマネージャーを止めて無線インターフェースを解放してください。当然ですがroot権限でログインしていることを前提にしています。
service network-manager stop
killall wpa_supplicant
まず、AP役・STA役・コンフィギュレーター役マシンにそれぞれ設定ファイルを準備します。AP役のhostapd.confは「WPA2-PSKで動作している既存AP」なので特に変わったことはありません。いっぽうSTA役のwpa_supplicant.confは「update_config=1/dpp_config_processing=2」だけが入って具体的な設定は何も入っておらず、ここに設定を「プッシュする」ことになります。
hostapd-dpp.conf(AP役):
ctrl_interface=/var/run/hostapd
ssid=dpp-test
ieee80211n=1
hw_mode=g
channel=6
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=secret1234
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ieee80211w=1
dpp-station.conf(STA役):
ctrl_interface=/var/run/wpa_supplicant
update_config=1
dpp_config_processing=2
コンフィギュレーター役のsupplicant.confはwpa_cliへの制御パスを示しているだけです。
dpp-configurator.conf(コンフュギュレーター役):
ctrl_interface=/var/run/wpa_supplicant
(1) AP役のマシン上でhostapdを起動する
killall hostapd
hostapd -i wlan0 hostapd-dpp.conf -d
(2) STA役のマシン上でwpa_supplicantとwpa_cliを起動する
killall wpa_supplicant
wpa_supplicant -i wlan0 -c dpp-station.conf -d
wpa_cli
(3) STA役のマシンのwpa_cliで下記のコマンドを実行する。
> dpp_bootstrap_gen type=qrcode mac=e4:f4:c6:4c:57:f2
1
> dpp_bootstrap_get_uri 1
DPP:M:e4:f4:c6:4c:57:f2;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD0IcAU9YhTkZLdJX4dSBVaJ2Z9s1uuXDFnzLkWJhSG84=;;
> dpp_listen 2437
OK
e4:f4:c6:4c:57:f2はSTA役マシンのWi-FiインターフェースのMACアドレスです。
(3) コンフュギュレータ役のマシン上でwpa_supplicantとwpa_cliを起動する
killall wpa_supplicant
wpa_supplicant -i wlan0 -c dpp-configurator.conf -d
wpa_cli
(4) コンフュギュレータ役マシンのwpa_cliで下記のコマンドを実行する。
> dpp_configurator_add
1
> dpp_qr_code DPP:M:e4:f4:c6:4c:57:f2;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD0IcAU9YhTkZLdJX4dSBVaJ2Z9s1uuXDFnzLkWJhSG84=;;
1
DPP:M4:e4:f4:c6:4c:57:f2...は(4)で実行したdpp_bootstrap_get_uriコマンドの吐いた文字列です。Easy Connect本来の用法ならば、QRコードとしてスマートフォンのカメラで設定アプリに取り込まれる「はず」の情報になります。この中身については下記のコマンドで見ることもできます。
> dpp_bootstrap_info 1
type=QRCODE
mac_addr=e4:f4:c6:4c:57:f2
info=
num_freq=0
curve=prime256v1
pkhash=fc1b4f45bd62f417ea8917eb600a094c19a2eb111b3807ac340b21aeb392b2ce
(5) コンフュギュレータ役マシンのwpa_cliで下記のコマンドを実行する。
> dpp_auth_init peer=1 configurator=1 conf=sta-psk ssid=6470702d74657374 pass=73656372657431323334
成功すれば、コンフュギュレータ役マシンのwpa_cliには下記のように表示されるはずです。
<3>DPP-TX dst=e4:f4:c6:4c:57:f2 freq=2437 type=0
<3>DPP-TX-STATUS dst=e4:f4:c6:4c:57:f2 freq=2437 result=SUCCESS
<3>DPP-RX src=e4:f4:c6:4c:57:f2 freq=2437 type=1
<3>DPP-AUTH-DIRECTION mutual=0
<3>DPP-TX dst=e4:f4:c6:4c:57:f2 freq=2437 type=2
<3>DPP-TX-STATUS dst=e4:f4:c6:4c:57:f2 freq=2437 result=SUCCESS
<3>DPP-AUTH-SUCCESS init=1
<3>DPP-CONF-REQ-RX src=e4:f4:c6:4c:57:f2
<3>DPP-CONF-SENT
STA役のマシンのwpa_cliには下記のように表示されるはずです。なお54:27:1e:a4:dd:88はコンフィギュレーター役マシン・84:25:3f:15:61:51はAP役マシンのMACアドレスです。
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=0
<3>DPP-TX dst=54:27:1e:a4:dd:88 freq=2437 type=1
<3>DPP-TX-STATUS dst=54:27:1e:a4:dd:88 freq=2437 result=SUCCESS
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=2
<3>DPP-AUTH-SUCCESS init=0
<3>GAS-QUERY-START addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437
<3>GAS-QUERY-DONE addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437 status_code=0 result=SUCCESS
<3>DPP-CONF-RECEIVED
<3>DPP-CONFOBJ-SSID dpp-test
<3>DPP-NETWORK-ID 0
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>SME: Trying to authenticate with 84:25:3f:15:61:51 (SSID='dpp-test' freq=2437 MHz)
<3>Trying to associate with 84:25:3f:15:61:51 (SSID='dpp-test' freq=2437 MHz)
<3>Associated with 84:25:3f:15:61:51
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>WPA: Key negotiation completed with 84:25:3f:15:61:51 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 84:25:3f:15:61:51 completed [id=0 id_str=]
なんかゴチャゴチャ表示されてわけがわからないですが、とにもかくにも「STA上のwpa_supplicant.confを編集することなく、外部のマシン(コンフィギュレーター)の操作だけでAPに接続できた」わけです。STA役マシン上のdpp-station.confは次のように更新されているはずです。
ctrl_interface=/var/run/wpa_supplicant
update_config=1
country=US
dpp_config_processing=2
network={
ssid="dpp-test"
psk="secret1234"
key_mgmt=WPA-PSK FT-PSK WPA-PSK-SHA256
ieee80211w=1
}
ここで、打ち込んだコマンドの意味を順番に説明してみます。
dpp_bootstrap_gen type=qrcode mac=e4:f4:c6:4c:57:f2
エンローリーの「ブートストラップ情報」を作成します。この操作に伴って公開鍵・秘密鍵のペアが新たに作成され、そこに対応ノードの情報(MACアドレス)を付加したQRコードが生成されます。mac=以外にはchan, info, curve, keyなどのオプションがありますが、解説は割愛します。
dpp_bootstrap_get_uri 1
ブートストラップ情報を文字列形式で表示します。Easy Connect本来の用法ならば「QRコードとして印刷あるいは表示されるはずの情報」になります。
dpp_listen 2437
エンローリーのDPP受信機能を2437MHz(ch=6)で有効にします。この例ではAPと同じチャンネルにしていますが、違っていても良いようです。dpp_bootstrap_genにオプションで含めることのできるchan情報とどういう関係にあるのか、正直よくわかりません。
dpp_configurator_add
サプリカントの持つコンフュグレーター機能を有効にします。
dpp_qr_code DPP:M:e4:f4:c6:4c:57:f2;...
QRコード(ブートストラップ情報)をコンフュグレーターに入力します。スマートフォンならば「カメラ経由で取り込むはずの操作」になります。
dpp_auth_init peer=1 configurator=1 conf=sta-psk ssid=6470702d74657374 pass=73656372657431323334
コンフィギュレーターからエンローリーに対して設定要求を送信します。「peer=1」は「dpp_qr_codeに紐づけられた番号」、「configurator=1」は「dpp_configurator_addに紐づけられた番号」で、この場合はどちらも1個づつしか存在しないので共に1を指定しています。「conf=sta-psk」は「エンローリーの役割(ロール)をWPA2-PSKモードのステーションとして設定」を意味し、ssid=とpass=は16進表記での"dpp-test"と"secret1234"です。ロールには以下の文字列が指定可能なことになっています。
ap-<mode>
sta-<mode>
configurator
<mode>は更に以下の文字列が指定可能なことになっています。
psk
sae
psk+sae
dpp
dpp+sae
dpp+psk+sae
dot1x
理屈の上ではAPをエンローリーとして、コンフィギュレーターから「dpp_auth_init conf=ap-psk」で設定することも可能な仕組みになっているはずですが、手元の実験では上手くゆきません。wpa_supplicantをAPモードで動かすと「DPP-FAIL Configurator rejected configuration」として拒絶されます。hostapdではauth_initを受信してDPP-CONFOBJ-xxxのかたちでAKM(セキュリティモード)・SSID・PASSが表示はされるのですが、APとしての動作には反映されません。
DPP設定の中身について
Easy ConnectではAction Frame (Public Action, GAS Initial Request/Response)を拡張した一連の「DPP Action Frame」が定義されています。コンフィギュレーターとエンローリー間の通信はまず「何らかの安全な方法で」エンローリーの情報をコンフィギュレーターに登録する「Bootstrap」、互いの存在を確認し検証する「DPP Authentication」が行われ、次にエンローリーからコンフィギュレーターに「DPP Configuration Request」が送られます。ちょっと変わっているのは、DPP Configuration Requestはエンローリーからコンフィギュレーターへ送られ、コンフィギュレーターからは設定情報はがDPP Configuration Responseとして返されることです。なので「設定をプッシュする」と言いながら、実は「引っ張る」かたちになります。
要するに「あんたがコンフィギュレーターということは確認した(DPP-AUTH-SUCCESS)。で、僕は何をやればいい?(DPP-CONF-REQ-RX)」「君にはWPA2-PSKのSTAとして動作してもらう、SSIDとパスフレーズはこれだ(DPP-CONF-RECEIVED/DPP-CONFOBJ-SSID dpp-test)」みたいなやりとりが行われるわけです。もちろんこれらの情報は公開鍵認証で互いの正当性を確認したうえで暗号化されて交換されています。
DPP認証を用いたEasy Connect設定・動作例
Easy ConnectではPSKやSAEなどのパスフレーズ/パスワード認証方式に加えて、新たにDPP認証方式が追加されました。RNS IE上でのAKMスイート番号は50:6f:9a:02になります(※註)。PSKやSAEが00:0f:ac:xxなのに50:6f:9aになっているのは、この認証方式がIEEE802.11規格ではなくWi-Fi Alliance規格であることを示しています。
(※註) AKMスイート50:6f:9a:01は以前に何かに割り当てられていたはずですが、これが何なのかわかりませんでした。WPA-PSKは00:50:f2(Microsoft):02なので違います。
DPP認証ではコンフュギュレーターの秘密鍵を用いて認証子を付けた公開鍵(コネクター)を各ノードに設定します。ノード同士(APとSTA)は接続時に互いの持つコネクターを交換し、それぞれコンフィギュレーターの公開鍵を用いてコネクターの正当性を検証したあとECDH鍵交換手順を用いて共通鍵を算出します。これによってパスワードやパスフレーズを用いず、PKI証明書も使わない鍵交換を実装しています。
以下にDPP認証を用いたEasy Connect設定・動作例を示します。dpp-station.confとdpp-configurator.confはPSK実験のときと同じです。PSK実験で追加されたnetwork={}節は編集して削除しておいてください。
hostapd-dpp.conf(AP役):
ctrl_interface=/var/run/hostapd
ssid=dpp-test
ieee80211n=1
hw_mode=g
channel=6
wpa=2
wpa_key_mgmt=DPP
ieee80211w=2
dpp-station.conf(STA役):
ctrl_interface=/var/run/wpa_supplicant
update_config=1
dpp_config_processing=2
dpp-configurator.conf(コンフュギュレーター役):
ctrl_interface=/var/run/wpa_supplicant
(1) AP役のマシン上でhostapdとhostapd_cliを起動する
killall hostapd
hostapd -i wlan0 hostapd-dpp.conf -d
hostapd_cli
(2) AP役マシン上のhostapd_cliで下記のコマンドを実行する。
> dpp_bootstrap_gen type=qrcode mac=84:25:3f:15:61:51
1
> dpp_bootstrap_get_uri 1
1> DPP:M:84:25:3f:15:61:51;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD30iIJmh6fTu+o6vVVNyet0YP9QlIWbyCJ68WCJDGp7E=;;>
> dpp_listen 2437
OK
84:25:3f:15:61:51はAP役マシンのWi-FiインターフェースのMACアドレスです。
(3) コンフュギュレータ役のマシン上でwpa_supplicantとwpa_cliを起動する
killall wpa_supplicant
wpa_supplicant -i wlan0 -c dpp-configurator.conf -d
wpa_cli
(4) コンフュギュレータ役マシンのwpa_cliで下記のコマンドを実行する。
> dpp_configurator_add
> dpp_qr_code DPP:M:84:25:3f:15:61:51;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD30iIJmh6fTu+o6vVVNyet0YP9QlIWbyCJ68WCJDGp7E=;;
> dpp_auth_init peer=1 configurator=1 conf=ap-dpp ssid=6470702d74657374
dpp_auth_initが成功すれば、AP役マシンのhostapd_cliには下記のような情報がゾロゾロと表示されるはずです。
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=0
<3>DPP-TX dst=54:27:1e:a4:dd:88 freq=2437 type=1
<3>DPP-TX-STATUS dst=54:27:1e:a4:dd:88 result=SUCCESS
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=2
<3>DPP-AUTH-SUCCESS init=0
<3>GAS-QUERY-START addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437
<3>GAS-QUERY-DONE addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437 status_code=0 result=SUCCESS
<3>DPP-CONF-RECEIVED
<3>DPP-CONFOBJ-AKM dpp
<3>DPP-CONFOBJ-SSID dpp-test
<3>DPP-CONNECTOR eyJ0eXAiOiJkcHBDb24iLCJraWQiOiJob2dBVnJUY3NXYmRkNUhOcmZlcHVzdExBSk1ORHRHdUcwX3c0anQtSWo4IiwiYWxnIjoiRVMyNTYifQ.eyJncm91cHMiOlt7Imdyb3VwSWQiOiIqIiwibmV0Um9sZSI6ImFwIn1dLCJuZXRBY2Nlc3NLZXkiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiI1MFg5MHlQR0hVcDJMZ3duUkdpWWJMV2NSeVZFN1NDZHVFclFraEFPbkJzIiwieSI6ImNqaDJpYW1jSE1IOXQzRlpOb1lxWEpYdkk4dndSTHZObEVkRXkwNVlNWDgifX0.d2blhSQBc5uV9MBweXiNtA4KLLMLhKaELqx0MUAjHGXCKW0MmMGaUNcX-MoGkidT3j4jLqa5lCRhe8awofwjOQ
<3>DPP-C-SIGN-KEY 3059301306072a8648ce3d020106082a8648ce3d03010703420004e674003bda489150f6a7bb190a2f6fe669483960c4c77ad5f95ad835574cc5edc6467dc7071d3ead726182062f29cd236c391b62c0d7a00ccb955cbddf4042b8
<3>DPP-NET-ACCESS-KEY 3077020101042055a132300a962d1011338dd63007cf55b11c3ab1af069a7ba2e8786824f5871aa00a06082a8648ce3d030107a14403420004e745fdd323c61d4a762e0c274468986cb59c472544ed209db84ad092100e9c1b72387689a99c1cc1fdb7715936862a5c95ef23cbf044bbcd944744cb4e58317f
(6) AP役マシン上のhostapd_cliで下記のコマンドを実行する。
>set dpp_connector eyJ0eXAiOiJkcHBDb24iLCJraWQiOiJob2dBVnJUY3NXYmRkNUhOcmZlcHVzdExBSk1ORHRHdUcwX3c0anQtSWo4IiwiYWxnIjoiRVMyNTYifQ.eyJncm91cHMiOlt7Imdyb3VwSWQiOiIqIiwibmV0Um9sZSI6ImFwIn1dLCJuZXRBY2Nlc3NLZXkiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiI1MFg5MHlQR0hVcDJMZ3duUkdpWWJMV2NSeVZFN1NDZHVFclFraEFPbkJzIiwieSI6ImNqaDJpYW1jSE1IOXQzRlpOb1lxWEpYdkk4dndSTHZObEVkRXkwNVlNWDgifX0.d2blhSQBc5uV9MBweXiNtA4KLLMLhKaELqx0MUAjHGXCKW0MmMGaUNcX-MoGkidT3j4jLqa5lCRhe8awofwjOQ
OK
> set dpp_csign 3059301306072a8648ce3d020106082a8648ce3d03010703420004e674003bda489150f6a7bb190a2f6fe669483960c4c77ad5f95ad835574cc5edc6467dc7071d3ead726182062f29cd236c391b62c0d7a00ccb955cbddf4042b8
OK
> set dpp_netaccesskey 3077020101042055a132300a962d1011338dd63007cf55b11c3ab1af069a7ba2e8786824f5871aa00a06082a8648ce3d030107a14403420004e745fdd323c61d4a762e0c274468986cb59c472544ed209db84ad092100e9c1b72387689a99c1cc1fdb7715936862a5c95ef23cbf044bbcd944744cb4e58317f
OK
dpp_connector, dpp_csign, dpp_netaccesskeyは(5)で表示された情報です。何故かhostapdはこれらを自動的に自分自身に設定する機能が無いので、人力でコピペして打ち直してやる必要があります。
(5) STA役のマシン上でwpa_supplicantとwpa_cliを起動する
killall wpa_supplicant
wpa_supplicant -i wlan0 -c dpp-station.conf -d
wpa_cli
(6) STA役のマシンのwpa_cliで下記のコマンドを実行する。
> dpp_bootstrap_gen type=qrcode mac=e4:f4:c6:4c:57:f2
1
> dpp_bootstrap_get_uri 1
DPP:M:e4:f4:c6:4c:57:f2;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACi8lqt1CXQGfmCaokeOuhsKMOlhE11QFBXRMe8UJafxY=;;
>
> dpp_listen 2437
(7) コンフュギュレータ役マシンのwpa_cliで下記のコマンドを実行する。
> dpp_qr_code DPP:M:e4:f4:c6:4c:57:f2;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACi8lqt1CXQGfmCaokeOuhsKMOlhE11QFBXRMe8UJafxY=;;
2
> dpp_auth_init peer=2 configurator=1 conf=sta-dpp ssid=6470702d74657374
操作(4)とほぼ同じですが、conf=ap-dppではなくsta-dppになっていること、peer=2になっていることが違います。peer=2はSTA役マシンのqrcodeに紐づいた番号です。
auth_initがうまく動けば、コンフィギュレーター役wpa_cliには次のように表示され、
> dpp_auth_init peer=2 configurator=1 conf=sta-dpp ssid=6470702d74657374
OK
<3>DPP-TX dst=e4:f4:c6:4c:57:f2 freq=2437 type=0
<3>DPP-TX-STATUS dst=e4:f4:c6:4c:57:f2 freq=2437 result=SUCCESS
<3>DPP-RX src=e4:f4:c6:4c:57:f2 freq=2437 type=1
<3>DPP-AUTH-DIRECTION mutual=0
<3>DPP-TX dst=e4:f4:c6:4c:57:f2 freq=2437 type=2
<3>DPP-TX-STATUS dst=e4:f4:c6:4c:57:f2 freq=2437 result=SUCCESS
<3>DPP-AUTH-SUCCESS init=1
<3>DPP-CONF-REQ-RX src=e4:f4:c6:4c:57:f2
<3>DPP-CONF-SENT
STA役wpa_cliには次のようにゾロゾロと表示されるはずです。
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=0
<3>DPP-TX dst=54:27:1e:a4:dd:88 freq=2437 type=1
<3>DPP-TX-STATUS dst=54:27:1e:a4:dd:88 freq=2437 result=SUCCESS
<3>DPP-RX src=54:27:1e:a4:dd:88 freq=2437 type=2
<3>DPP-AUTH-SUCCESS init=0
<3>GAS-QUERY-START addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437
<3>GAS-QUERY-DONE addr=54:27:1e:a4:dd:88 dialog_token=0 freq=2437 status_code=0 result=SUCCESS
<3>DPP-CONF-RECEIVED
<3>DPP-CONFOBJ-SSID dpp-test
<3>DPP-CONNECTOR eyJ0eXAiOiJkcHBDb24iLCJraWQiOiJob2dBVnJUY3NXYmRkNUhOcmZlcHVzdExBSk1ORHRHdUcwX3c0anQtSWo4IiwiYWxnIjoiRVMyNTYifQ.eyJncm91cHMiOlt7Imdyb3VwSWQiOiIqIiwibmV0Um9sZSI6InN0YSJ9XSwibmV0QWNjZXNzS2V5Ijp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiWWY3d29XR2cyMkZOcEpGNlJHdXdyN25sWDB5akY5NXB6aURGUHYzZEFvSSIsInkiOiJ2RWFlUVFUN0pGQ1JELVo2QzFHMkU0RzJEakg3S0wzXzdEVDF3QkNKZWo4In19.YkcaPeSu-LBPAp-Tv-psMz7yE0vJtIuGI1AQlduSji6aRhdJH8SNTZU_QF3KTTQHOywjthDcwXPk2W2R-FYSXw
<3>DPP-C-SIGN-KEY 3059301306072a8648ce3d020106082a8648ce3d03010703420004e674003bda489150f6a7bb190a2f6fe669483960c4c77ad5f95ad835574cc5edc6467dc7071d3ead726182062f29cd236c391b62c0d7a00ccb955cbddf4042b8
<3>DPP-NET-ACCESS-KEY 30770201010420f793bc81540d671d606efa396a2b68bba95556478edee22724d45f3bcc92b6a9a00a06082a8648ce3d030107a1440342000461fef0a161a0db614da4917a446bb0afb9e55f4ca317de69ce20c53efddd0282bc469e4104fb2450910fe67a0b51b61381b60e31fb28bdffec34f5c010897a3f
<3>DPP-NETWORK-ID 0
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-NETWORK-NOT-FOUND
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>DPP-TX dst=84:25:3f:15:61:51 freq=2437 type=5
<3>DPP-TX-STATUS dst=84:25:3f:15:61:51 freq=2437 result=SUCCESS
<3>DPP-RX src=84:25:3f:15:61:51 freq=2437 type=6
<3>PMKSA-CACHE-ADDED 84:25:3f:15:61:51 0
<3>DPP-INTRO peer=84:25:3f:15:61:51 status=0
<3>SME: Trying to authenticate with 84:25:3f:15:61:51 (SSID='dpp-test' freq=2437 MHz)
<3>Trying to associate with 84:25:3f:15:61:51 (SSID='dpp-test' freq=2437 MHz)
<3>Associated with 84:25:3f:15:61:51
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>WPA: Key negotiation completed with 84:25:3f:15:61:51 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 84:25:3f:15:61:51 completed [id=0 id_str=]
STA役マシンのdpp-station.confには次のようなnetwork={}節が追加されているはずです。
ctrl_interface=/var/run/wpa_supplicant
update_config=1
country=US
dpp_config_processing=2
network={
ssid="dpp-test"
key_mgmt=DPP
ieee80211w=2
dpp_connector="eyJ0eXAiOiJkcHBDb24iLCJraWQiOiJob2dBVnJUY3NXYmRkNUhOcmZlcHVzdExBSk1ORHRHdUcwX3c0anQtSWo4IiwiYWxnIjoiRVMyNTYifQ.eyJncm91cHMiOlt7Imdyb3VwSWQiOiIqIiwibmV0Um9sZSI6InN0YSJ9XSwibmV0QWNjZXNzS2V5Ijp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiWWY3d29XR2cyMkZOcEpGNlJHdXdyN25sWDB5akY5NXB6aURGUHYzZEFvSSIsInkiOiJ2RWFlUVFUN0pGQ1JELVo2QzFHMkU0RzJEakg3S0wzXzdEVDF3QkNKZWo4In19.YkcaPeSu-LBPAp-Tv-psMz7yE0vJtIuGI1AQlduSji6aRhdJH8SNTZU_QF3KTTQHOywjthDcwXPk2W2R-FYSXw"
dpp_netaccesskey=30770201010420f793bc81540d671d606efa396a2b68bba95556478edee22724d45f3bcc92b6a9a00a06082a8648ce3d030107a1440342000461fef0a161a0db614da4917a446bb0afb9e55f4ca317de69ce20c53efddd0282bc469e4104fb2450910fe67a0b51b61381b60e31fb28bdffec34f5c010897a3f
dpp_csign=3059301306072a8648ce3d020106082a8648ce3d03010703420004e674003bda489150f6a7bb190a2f6fe669483960c4c77ad5f95ad835574cc5edc6467dc7071d3ead726182062f29cd236c391b62c0d7a00ccb955cbddf4042b8
}
STAと異なり、AP役マシンのhostapd_dpp.confは上書きされません。なので一度hostapdを落として再起動すると接続できなくなってしまいます。下記のように、connector/netaccesskey/csignのパラメーターを人力で追加して設定を固定することも可能ではあります。
ctrl_interface=/var/run/hostapd
ssid=dpp-test
ieee80211n=1
hw_mode=g
channel=6
wpa=2
wpa_key_mgmt=DPP
dpp_connector=eyJ0eXAiOiJkcHBDb24iLCJraWQiOiJob2dBVnJUY3NXYmRkNUhOcmZlcHVzdExBSk1ORHRdUcwX3c0anQtSWo4IiwiYWxnIjoiRVMyNTYifQ.eyJncm91cHMiOlt7Imdyb3VwSWQiOiIqIiwibmV0Um9sZSI6ImFwIn1dLCJuZXRBY2Nlc3NLZXkiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiI1MFg5MHlQR0hVcDJMZ3duUkdpWWJMV2NSeVZFN1NDZHVFclFraEFPbkJzIiwieSI6ImNqaDJpYW1jSE1IOXQzRlpOb1lxWEpYdkk4dndSTHZObEVkRXkwNVlNWDgifX0.d2blhSQBc5uV9MBweXiNtA4KLLMLhKaELqx0MUAjHGXCKW0MmMGaUNcX-MoGkidT3j4jLqa5lCRhe8awofwjOQ
dpp_csign=3059301306072a8648ce3d020106082a8648ce3d03010703420004e674003bda489150f6a7bb190a2f6fe669483960c4c77ad5f95ad835574cc5edc6467dc7071d3ead726182062f29cd236c391b62c0d7a00ccb955cbddf4042b8
dpp_netaccesskey=3077020101042055a132300a962d1011338dd63007cf55b11c3ab1af069a7ba2e8786824f5871aa00a06082a8648ce3d030107a14403420004e745fdd323c61d4a762e0c274468986cb59c472544ed209db84ad092100e9c1b72387689a99c1cc1fdb7715936862a5c95ef23cbf044bbcd944744cb4e58317f
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ieee80211w=2
暗号みたいな文字列がいくつも出てきて「どこがEasyやねん」と突っ込みたくなりますが、とにかくこれがEasy Connectが本来意図したDPP認証モードです。hostapdを使った実験では人力打ち込みが必要以上に多くなっていますが、「本来ならば」コンフィギュレーターに入力する情報はエンローリーのQRコードとSSIDだけで、レガシーモー(PSK/SAE)と違ってパスフレーズやパスワードを打ち込まなくて済む(はず)という手順になっています。
DPP認証プロトコルについて
DPP認証プロトコルではいつものProber Request-Responseのあと、Authenticationの前にAction Frameを用いた「DPP Peer Discovery」手続きが行われ、ここでAP・STAそれぞれの持つDPP Connectorが交換されます。
DPP ConnectorはBASE64エンコードされたJSON情報で、JWS Protected Header・JWS Payload(DPP Connector Body Object)・Signatureの3つをドット(.)で接続したフォーマットです。DPP Connector Bodyをデコードすると下記のようになっています。
{"groups":[{"groupId":"*","netRole":"ap"}],"netAccessKey":{"kty":"EC","crv":"P-256","x":"50X90yPGHUp2LgwnRGiYbLWcRyVE7SCduErQkhAOnBs","y":"cjh2iamcHMH9t3FZNoYqXJXvI8vwRLvNlEdEy05YMX8"}}
{"groups":[{"groupId":"*","netRole":"sta"}],"netAccessKey":{"kty":"EC","crv":"P-256","x":"Yf7woWGg22FNpJF6RGuwr7nlX0yjF95pziDFPv3dAoI","y":"vEaeQQT7JFCRD-Z6C1G2E4G2DjH7KL3_7DT1wBCJej8"}}
この例ではEC P-256アルゴリズムの公開鍵で、JWS Protected HeaderとSignatureにはその正当性を検証するための情報が含まれています。STAとAPとDPP Peer Discovery Request/Responseで互いのDPP Peer Discoveryを交換して正当性を検証したあと、互いに持っている秘密鍵(netaccesskey)を用いて共通鍵PMKを算出、そのPMKに基づいてEAPoL 4-way handshakeを行って暗号鍵を確立します。
「ECDH鍵交換アルゴリズムを用いたPMKの確立」「確立したPMKを前提とした4-way handshake」は実質的にWPA3-SAEと同じことをやっていて、WPA3-SAEではAuthentication Commit-Confirmの2往復だったのがDPPではAction Frameの1往復になっていることが違う、とも言えます。「ECDHを用いたWi-Fiの鍵交換方式」にSAE(Authenticationで行う)・OWE(Associationで行う)・DPP(Actionで行う)の似て非なる3方式が並立しているとも言えるわけで、なんだかなーという気にもなります。
Wi-Fi Easy Connectの現状
ではこのWi-Fi Easy Connectがどれだけ普及しているのか、Wi-Fi AllianceのProduct Finderサービスで検索してみると、2025年6月時点で認証された製品は41品種しかありませんでした。2018年に仕様初版がリリースされた割にはだいぶ寂しい現状です。冒頭で「存在感の薄い新企画」と書いた理由でもあります。
理屈の上では「セキュリティホールになり得るパスフレーズ/パスワード(覚えやすいほど破られやすいという古典的理由)に代わる公開鍵暗号ベースの認証を、めんどくさいPKI証明書抜きで、QRコードとスマートフォンを使ってかんたん設定」という企画だったのでしょうけれど、企業組織はもう10年以上前から「めんどくさいPKI証明書」のEAPエンタープライズ認証を使っているし、一般消費者は「パスフレーズ/パスワードで別に困っているわけでもないし」という意識で、いわゆるGood Enough/Not Enoughの法則で市場訴求力を発揮できていないように思えます。
まとめ
以上、簡単にWi-Easy Connect/DPPの使い方と動作原理についてhostapd/wpa_supplicantを用いた実験実例を交えて紹介しました。
弊社も長いこと無線LAN製品を扱ってきたので、無線LAN製品の設定にはWEPの時代からずっと悩まされてきました。特に、イーサネットやUSBなどの有線インターフェースを持たない(Wi-Fiしか無い)デバイスは「どうやって設定させるのか」が問題となって製品企画も及び腰になる傾向がありました。
最近では初期設定用にBluetooth LEを持たせて、スマートフォンAPPからBLEを用いて未設定デバイスの検出・設定のプッシュを行うという実装も多くなっています。しかしユーザーにとっては各メーカー各製品毎のAPPをいちいちダウンロードするのは面倒だし、メーカーにとっては初期設定のため「だけ」にBLEを持たせることも設定APPをいちいち開発するのも可能なら避けたいところです。
Wi-Fi Wi-Easy Connectはそれを解決できるソリューションのはずなのですが、上記のようにいまひとつ普及の勢いが感じられない、というのが本音です。