Raspberry Piの無線LANをmicroSDで設定する


Raspberry Pi 3 Model BやPi Zero Wには無線LAN(WiFi)が内蔵されましたが、何らかの方法でSSIDとパスフレーズを設定しないと無線での通信はできません。
以前に書いたRaspberry Pi Zero Wの無線LANをディスプレイやキーボードなしで設定する(有線LAN利用)という記事ではRaspberry Pi Zero WにUSBで一時的に有線LANポートを設けるするやり方で、ディスプレイやキーボードを使わずにSSIDとパスフレーズを設定する方法を紹介しましたが、こちらの記事のコメントでmicroSDにあらかじめファイルを作成しておくことで、無線LANの設定ができるというご指摘をいただき、その方法を検証してみましたので紹介したいと思います。

(2017/10/01追記)
ブラウザ上でSSIDとパスフレーズを入力するだけで簡単にwpa_supplicant.confを作成できるツールを作成しました。
Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った

動作環境

  • Raspberry Pi Zero W
    • Raspbian Jessie Lite 2017-07-05
      • イメージをMicroSDに書き込んだ後、MicroSDのルートディレクトリにsshという名前で空のファイルを作成
    • Raspbian Stretch Lite 2017-08-16
      • イメージをMicroSDに書き込んだ後、MicroSDのルートディレクトリにsshという名前で空のファイルを作成

設定

SSH接続を利用するにはイメージをmicroSDに書き込んだ後、microSDのルートディレクトリにsshという名前で空のファイルを作成しておく必要があります。

macOSであれば、touchコマンドを用いてtouch /Volumes/boot/sshといった要領で空のファイルsshを作成できます。

また、Raspberry Piの内蔵WiFiでは2.4GHz帯のみ利用できます。ルーターのデフォルトの設定では、2.4GHz帯のSSIDにはgやGといった文字が含まれていることが多いです。

設定ファイルの作成

wpa_supplicant.confというファイルをmicroSDのルートディレクトリに作成していきます。
このファイルをmicroSDのルートディレクトリに作成すると、Raspberry Pi起動時に自動でRaspbian上の/etc/wpa_supplicant/wpa_supplicant.confを上書きするようになっています(microSDのルートディレクトリに作成したファイルは削除されます)。

平文のWPAパスフレーズを保存する場合

SSIDがtest, パスフレーズがabcd1234の場合、以下のようなファイルをmicroSDのルートディレクトリに作成します(macOSの場合、/Volumes/boot/wpa_supplicant.conf)

wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="test"
    psk="abcd1234"
}

パスフレーズが設定されていない場合は、Life with IT - Raspberry Pi 3でパスフレーズなしのWi-Fiアクセスポイントに接続する設定(Raspbian Jessie Lite)を見て設定してください(自己責任でお願いします)

256bitのハッシュ化されたキーを保存する場合

平文のWPAパスフレーズをmicroSD上に保存することに抵抗がある方は、パスフレーズの代わりに、SSIDとパスフレーズの組をハッシュ化した256bitのキーを保存することもできます。
Raspbian上でwpa_passphraseコマンドを実行することで、256bitのキーを取得することもできますが、今回はJavaScriptで256bitのキーを取得する方法を2通り紹介します。

ブラウザで256bitのキーを取得する場合

WPA key calculation: From passphrase to hexのページにアクセスし、Network SSIDとWPA passphraseを入力し、Calculateボタンをクリックします。

899f089ca767f38265424c83ce83193ab145571c0a71e1aca4487d615c411f34のような256bitのキーが表示されるので、これを元に以下のようなファイルをmicroSDのルートディレクトリに作成します(macOSの場合、/Volumes/boot/wpa_supplicant.conf)

wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="test"
    psk=899f089ca767f38265424c83ce83193ab145571c0a71e1aca4487d615c411f34
}

Node.jsで256bitのキーを取得する場合

Node.js標準モジュールのCryptoを利用して、256bitのキーを取得することもできます。

SSIDがtest, パスフレーズがabcd1234の場合、以下のスクリプトを実行することで256bitのキーを取得できます。

const crypto = require('crypto');
const key = crypto.pbkdf2Sync('abcd1234', 'test', 4096, 32, 'sha1');
console.log(key.toString('hex'));

ターミナル上で実行できる形式はこちら

node -e "console.log(require('crypto').pbkdf2Sync('abcd1234','test',4096,32,'sha1').toString('hex'))"

ブラウザで256bitのキーを取得する場合と同様に、wpa_supplicant.confをmicroSDのルートディレクトリに作成してください。

wpa_passphraseコマンドで計算したキーの値と比較

WPA key calculation: From passphrase to hexのページで計算したキーの値、Node.jsで計算したキーの値共に、wpa_passphraseコマンドで計算したキーの値と同じものになっていました。

SSH接続

Windowsの場合は、Raspberry PiとMac or Windows PCを有線で直接繋いでさくっとSSH接続するなどを参照してください。

macOSでZeroconf(Bonjour)を利用する場合は、以下の方法でSSH接続をすることができます。

Raspberry PiにRaspbianが入っているMicroSDを入れて、電源を入れます。OSが起動するまで1分ほど待ちます。

macOS

パスワードを聞かれるので、 raspberryと入力してreturnキーを押します。

macOS
[email protected]'s password: 

繋がるはずです。

Raspbian
pi@raspberrypi:~ $

うまく繋がらない場合は、以前接続した際の設定が残っている可能性があるので、known_hostsの設定削除を行ってください。

macOS
$ ssh-keygen -R raspberrypi.local