基于AD、NPS与Unifi Controller的Raspbian设备WPA2企业级认证故障
背景
已完成Unifi Controller配置:通过自带证书的NPS,让Windows笔记本借助Active Directory(AD)计算机账户实现WPA2 Enterprise认证,无线网络配置经GPO推送,Windows设备运行正常。
现尝试为已通过SSSD绑定AD、且加入NPS允许认证组的Raspbian系统树莓派配置该认证,连接时NPS返回Reason-Code 8错误。
当前树莓派wpa_supplicant配置
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CH network={ ssid="SSID" proto=RSN key_mgmt=WPA-EAP pairwise=CCMP group=CCMP eap=TTLS identity="PI_HOSTNAME" ca_cert="/opt/wlan_cert/CA.pem" priority=1 }
NPS日志记录
<Event> <Timestamp data_type="4">08/17/2022 10:57:42.514</Timestamp> <Computer-Name data_type="1">PI_HOSTNAME</Computer-Name> <Event-Source data_type="1">IAS</Event-Source> <User-Name data_type="1">PI_HOSTNAME</User-Name> <NAS-IP-Address data_type="3">IP_AccessPoint</NAS-IP-Address> <NAS-Identifier data_type="1">IDENTIFIER_ID</NAS-Identifier> <Called-Station-Id data_type="1">XX-XX-XX-XX-XX-XX:SSID</Called-Station-Id> <NAS-Port-Type data_type="0">19</NAS-Port-Type> <Service-Type data_type="0">2</Service-Type> <Calling-Station-Id data_type="1">XX-XX-XX-XX-XX-XX</Calling-Station-Id> <Connect-Info data_type="1">CONNECT 0Mbps 802.11b</Connect-Info> <Acct-Session-Id data_type="1">SESSION_ID</Acct-Session-Id> <Acct-Multi-Session-Id data_type="1">Multi_SESSION_ID</Acct-Multi-Session-Id> <Framed-MTU data_type="0">1400</Framed-MTU> <Client-IP-Address data_type="3">IP_AccessPoint</Client-IP-Address> <Client-Vendor data_type="0">0</Client-Vendor> <Client-Friendly-Name data_type="1">HOSTNAME_AccessPoint</Client-Friendly-Name> <Proxy-Policy-Name data_type="1">POLICY_NAME</Proxy-Policy-Name> <Provider-Type data_type="0">1</Provider-Type> <SAM-Account-Name data_type="1">DOMAIN\PI_HOSTNAME</SAM-Account-Name> <Fully-Qualifed-User-Name data_type="1">DOMAIN\PI_HOSTNAME</Fully-Qualifed-User-Name> <Class data_type="1">311 1 NPS_IP 08/15/2022 06:35:36 250</Class> <Authentication-Type data_type="0">5</Authentication-Type> <Packet-Type data_type="0">1</Packet-Type> <Reason-Code data_type="0">0</Reason-Code> </Event> <Event> <Timestamp data_type="4">08/17/2022 10:57:42.514</Timestamp> <Computer-Name data_type="1">NPS_HOSTNAME</Computer-Name> <Event-Source data_type="1">IAS</Event-Source> <Class data_type="1">311 1 NPS_IP 08/15/2022 06:35:36 250</Class> <Authentication-Type data_type="0">5</Authentication-Type> <Fully-Qualifed-User-Name data_type="1">DOMAIN\PI_HOSTNAME</Fully-Qualifed-User-Name> <SAM-Account-Name data_type="1">DOMAIN\PI_HOSTNAME</SAM-Account-Name> <Acct-Session-Id data_type="1">SESSION_ID</Acct-Session-Id> <Provider-Type data_type="0">1</Provider-Type> <Proxy-Policy-Name data_type="1">POLICY_NAME</Proxy-Policy-Name> <Client-Friendly-Name data_type="1">HOSTNAME_AccessPoint</Client-Friendly-Name> <Client-Vendor data_type="0">0</Client-Vendor> <Client-IP-Address data_type="3">IP_AccessPoint</Client-IP-Address> <Packet-Type data_type="0">3</Packet-Type> <Reason-Code data_type="0">8</Reason-Code> </Event>
疑问:该方案是否可行?如何解决认证失败问题?
方案可行性说明
完全可行。Linux系统(包括Raspbian)支持通过AD计算机账户进行WPA2 Enterprise认证,核心逻辑和Windows设备一致:利用AD计算机账户的身份凭证完成EAP阶段的验证,仅客户端配置细节存在差异。
Reason-Code 8原因分析
NPS的Reason-Code 8字面含义是「用户账户已过期」,但结合日志中AD已正确识别树莓派计算机账户(DOMAIN\PI_HOSTNAME)的情况,实际问题是客户端未提供有效的计算机身份验证凭证。Windows设备会自动加载计算机账户的Kerberos票据或机器证书完成认证,而Raspbian的wpa_supplicant默认不会自动注入这些凭证,需显式配置。
具体修复步骤
1. 修正wpa_supplicant配置
需补充计算机账户的认证标识和凭证配置,推荐使用TTLS+MSCHAPv2(匹配Windows默认计算机认证逻辑):
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CH network={ ssid="SSID" proto=RSN key_mgmt=WPA-EAP pairwise=CCMP group=CCMP eap=TTLS identity="PI_HOSTNAME$" # 关键:AD计算机账户必须以$结尾 anonymous_identity="anonymous" # TTLS匿名协商阶段标识 ca_cert="/opt/wlan_cert/CA.pem" phase2="auth=MSCHAPV2" # 指定阶段2认证方式为MSCHAPV2 password="PI_COMPUTER_ACCOUNT_PASSWORD" # 树莓派AD计算机账户的密码 priority=1 }
注意:若不想明文存储密码,可替换为
password_from_file=/path/to/password_file,并将密码文件权限设置为600,确保仅root可读。
2. 验证AD计算机账户状态
- 确认树莓派的AD计算机账户未过期、未被锁定
- 确认该账户已加入NPS允许认证的安全组
- 检查AD中该计算机账户的
servicePrincipalName属性,需包含host/PI_HOSTNAME.DOMAIN.COM和host/PI_HOSTNAME
3. 可选:使用Kerberos凭证替代明文密码
若不想存储计算机账户密码,可配置wpa_supplicant使用Kerberos票据:
- 验证树莓派已通过SSSD获取有效计算机Kerberos票据:执行
kinit -k PI_HOSTNAME$@DOMAIN.COM,无报错则说明凭证有效 - 修改wpa_supplicant配置的凭证相关参数:
eap=TTLS identity="PI_HOSTNAME$@DOMAIN.COM" phase2="auth=MSCHAPV2 use_kerberos=1"
4. 测试认证
重启wpa_supplicant服务使配置生效:
sudo systemctl restart wpa_supplicant
实时查看日志排查问题:
journalctl -u wpa_supplicant -f
补充说明
- Windows设备通过GPO自动配置时,会自动注入计算机账户的凭证和Kerberos配置,而Linux需手动指定这些参数
- 确保CA证书路径正确,且文件权限设置为
644,保证wpa_supplicant进程可读取 - 若使用PEAP而非TTLS,只需将
eap=PEAP,并调整phase2参数为phase2="auth=MSCHAPV2"
内容的提问来源于stack exchange,提问作者David

