WLI-UC-AG300Nドライバーのビルド

ビルトインのWiFiデバイスでWPAエンタープライズが使えなかったので比較するためにUSBのWiFIドングルを使ってみました。カーネルモジュールがなかったので作ることから始めます。

git clone https://github.com/shekhei/RT2870USB.git

ソースをダウンロードしてソースを編集します。ネットで調べてそれを参考にさせてもらいました。

common/rtusb_dev_id.c
..
        {USB_DEVICE(0x100D,0x9031)}, /* Motorola 2770 */
        {USB_DEVICE(0x0DB0,0x6899)},
        {USB_DEVICE(0x0411,0x012e)}, /* Buffalo WLI-UC-AG300N*/
#endif // RT2870 //
        { }/* Terminating entry */
..
os/linux/config.mk
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Armbianのカーネルヘッダーだけだとビルドできないのでソースをインストールします。

nano /usr/src/linux-source-5.4.6-sunxi64/include/generated/utsrelease.h
#define UTS_RELEASE "5.4.6-sunxi64"
/usr/src/RT2870USB
make -C /usr/src/linux-source-5.4.6-sunxi64 SUBDIRS=/usr/src/RT2870USB/os/linux modules

追記1

ソースをビルドしているときになにかおかしいことに気がついて見直してみました。そもそもネットの情報はかなり古い情報でソースも覗いてみたらかなり古そうでした。古いドライバーはたいていメインラインカーネルに組み込まれているはずなので、カーネルソースを調べてみました。

CONFIG_RT2800USB_UNKNOWN=y

このオプションを有効にして再ビルドしたら使えるようになりました。そしてこのデバイスでもやはりWPAエンタープライズは使えませんでした。ということはビルトインのデバイスの方も問題ない可能性が高いということになります。WPAエンタープライズ(eap-tls)の接続問題の原因の絞り込みはまだしばらく掛かりそうです。

追記2

問題の切り分けをしてどうもTLSの互換性に問題がありそうだったので整理してみました。

サーバ:
Debian Buster
クライアント:
Archlinux => OK
Ubuntu 18.04(派生含む) => NG

x86_64CPUとArm64CPUの2台UbuntuだけがともにNGでした。おそらくTLSバージョンが古いせいだと推論してみました。サーバのFreeradiusの設定を見てみるとTLSv1.2で設定してあり今まではArchlinuxのノートPCでは問題が起こりませんでした。しかしUbuntuはTLSv1.2に対応しておらず接続ができなかったようです。原因がわかってきたので次のようにFreeradiusを設定してみました。

/etc/freeradius/3.0/mods-available/eap
                tls_min_version = "1.1"
                tls_max_version = "1.2"

再起動してArmbianから接続してみたところ問題が解消しました。

追記3

もう少し調べてみたらUbuntu18.04のOpenSSLののバージョンは1.1.1でTLSv1.2に対応しているようです。Freeradiusに通らない原因は不明です。

 ldd /sbin/wpa_supplicant
libssl.so.1.1 => /usr/lib/aarch64-linux-gnu/libssl.so.1.1 (0x0000ffff85930000)

追記4

なんとなくしっくりこないのでもう一度、頭の中で整理してみました。debian busterはubuntu bionicより新しいopensslなので明示的に指定しないと最新のv1.2より上のTLSを使ってしまう。bionicのopensslはTLSv1.2対応である。ということは明示的にTLSv1.1でなくTLSv1.2を明示的に指定すれば良い。この推論でもう一度、freeradiusを設定してみたらうまく行きました。

/etc/freeradius/3.0/mods-available/eap
                tls_min_version = "1.2"
                tls_max_version = "1.2"

ついでにテストの過程でコマンドラインからの接続も試してみました。

/etc/wpa_supplicant/eap-tls.conf
network={
	ssid="MyNet"
	key_mgmt=WPA-EAP
	eap=TLS
	identity="orangepi"
	ca_cert="/etc/wpa_supplicant/Radius_Certificate_Authority.crt"
	client_cert="/etc/wpa_supplicant/orangepi@mynet.crt"
	private_key="/etc/wpa_supplicant/orangepi@mynet.pem"
	private_key_passwd="****"
} 
 wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/eap-tls.conf -D wext
dhclient