最近路由器的wifi名字改了,但是密码没有改。 看过我博客的朋友可能知道,我之前的pve是用的wifi无线连接的。 自然我就上不了网了。

寻找原因

遵循能够运行就不要改动的原则,我已经不记得我是如何配置的了。
赶紧查看我的pve的博客,找到命令。找到配置文件,修改ssid,运行 wpa_supplicant -B -i <wificard> -c /etc/xxx.conf的命令,成功,连上了wifi,原来修改如此简单,重启一下。

咋又没有网了?
赶紧插上显示器,连上键盘去看一看。
iwconfig,发现wifi没有连成功。再次手动运行命令,又成功了。

再重启,发现还是不行。
难道是路由器里面改了配置,把我的mac屏蔽了?

换了一个新的ssid,依然是自动连接不成功,手动连接成功。
中间问了chatglm和doubao,坑d啊,给的还是错误的命令,执行报错。

以为是没有开机自动启动,但是这个说法不对,因为之前一直是好的,能够正常运行。
systemctl status wpa_supplicant,显示loaded(inactive)。

再次去ai里面搜索,怎么添加开机启动。发现不止wpa_supplicant这个服务,还有一个wpa_supplicant@< wificard>名称的服务。 systemctl status wpa_supplicant@\< wificard>,一看,说是密码不对。

我就奇怪了,密码没有改,怎么就不对了?

wpa_supplicant-.conf里面的密码是这样的

network={
    ssid="MYSSID"
    #psk="passphrase"
    psk=59e0d07fa4c7741797a4e394f38a5c321e3bed51d54ad5fcbd3f84bc7415d73d
}

而/etc/xxx.conf里面是这样的

network={
    ssid="MYSSID"
    psk="passphrase"
   
}

密码怎么就不对?
拿着wpa_passphrase生成密码,发现是一个新的psk,问题找到了。确实是密码不对。
重新生成密码,更新psk的配置,重启,连接成功。
测试的时候,使用的是明文的密码,但是配置文件里面使用的是生成的密码,所以测试能成功,重启之后连不上。

wpa_passphrase

$ wpa_passphrase MYSSID passphrase
network={
    ssid="MYSSID"
    #psk="passphrase"
    psk=59e0d07fa4c7741797a4e394f38a5c321e3bed51d54ad5fcbd3f84bc7415d73d
}

为什么密码不对呢?因为wpa_passphrase生成的psk是和ssid有关系的,所以ssid改了,但是密码没有改,psk也是不一样的。

wpa_passphrase pre-computes PSK entries for network configuration blocks of a wpa_supplicant.conf file. An ASCII passphrase and SSID are used to generate a 256-bit PSK.

00061         pbkdf2_sha1(passphrase, ssid, os_strlen(ssid), 4096, psk, 32);
00062 
00063         printf("network={\n");
00064         printf("\tssid=\"%s\"\n", ssid);
00065         printf("\t#psk=\"%s\"\n", passphrase);
00066         printf("\tpsk=");
00067         for (i = 0; i < 32; i++)
00068                 printf("%02x", psk[i]);
00069         printf("\n");
00070         printf("}\n");

查看源码,我们 发现psk是pbkdf2_sha1生成的,而ssid是作为一个参数传入进去了。

pbkdf2_sha1 - SHA1-based key derivation function (PBKDF2) for IEEE 802.11i : ASCII passphrase : SSID : SSID length in bytes : Number of iterations to run : Buffer for the generated key : Length of the buffer in bytes Returns: 0 on success, -1 of failure

This function is used to derive PSK for WPA-PSK. For this protocol, iterations is set to 4096 and buflen to 32. This function is described in IEEE Std 802.11-2004, Clause H.4. The main construction is from PKCS#5 v2.0.

https://docs.ros.org/en/diamondback/api/wpa_supplicant/html/wpa__passphrase_8c_source.html https://linux.die.net/man/8/wpa_passphrase https://man.freebsd.org/cgi/man.cgi?wpa_passphrase