ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RK3576 Android 14有线以太网802.1X认证补丁实战全记录

RK3576 Android 14有线以太网802.1X认证补丁实战全记录 简介面向RK3576平台Android14系统的以太网802.1X认证补丁及示例工程适合嵌入式开发者和系统集成工程师解决设备接入企业级有线网络时的安全认证问题可广泛应用于办公室、学校、数据中心等需要严格准入控制的场景。补丁完整集成了wpa_supplicant、Connectivity、Wifi等模块的修改使设备能够通过802.1X协议如EAP-PEAP完成身份校验并附带可直接编译运行的APK demo便于快速验证和二次开发。资源共22个文件包含6个Java源码、4个patch补丁、3个XML配置以及demo界面截图和readme说明整体仅121KB结构精简清晰。已有126人学习下载。通过学习补丁中EthernetNative、SupplicantEthIfaceHal等核心类实现开发者可快速掌握Android14以太网802.1X接入流程并借助demo源代码构建符合企业安全策略的定制程序显著降低适配门槛也为后续网络功能扩展提供了参考基础。 车载、安防、工控这类Android设备一旦部署在政企环境里网络接入认证几乎是绕不开的一道坎。前段时间我们在RK3576平台上做Android 14系统定制客户要求有线以太网必须支持802.1X企业认证而不是普通DHCP就能上线的模式。排查完原生代码发现Android 14的Ethernet框架对有线网络只支持静态IP和DHCP压根没有留802.1X安全类型的口子。这篇就记录一下我给RK3576 Android 14打以太网802.1X补丁的完整过程包括框架改动、方案选型、编译验证和踩坑记录给同样要做有线认证的朋友一个可参考的路子。1. 先说清楚这个补丁到底在解决什么问题1.1 为什么RK3576平台需要额外处理802.1XRK3576是Rockchip面向中高端IoT、平板、车载和边缘计算设备推出的平台CPU算力、VPU解码和多屏输出能力都比较均衡不少整机方案直接跑Android 14出厂。但政企园区、运营商网关、医疗终端这类场景里有线网口通常对接华为、深信服、Cisco这些交换机的802.1X认证端口设备插网线后要么通过MAC旁路认证要么就必须走EAPOL协议做企业认证。原生Android对Wi-Fi的802.1X企业认证支持很完整但是有线以太网的安全认证却一直很弱。EthernetNetworkFactory在创建网络时只认DHCP和静态IP两种配网模式没有EAP-PEAP、EAP-TLS这类选项。这就导致一个很尴尬的局面Android设备在Wi-Fi下能做的企业认证换成网线就完全使不上劲。1.2 原生Android 14以太网栈的边界Android 14的以太网相关代码主要放在packages/modules/NetworkStack里由EthernetTracker、EthernetNetworkFactory、EthernetConfigStore几个类协作完成。IpConfiguration内部有一个SecurityType枚举但默认只有NONE、WEP、PSK几个值基本上照搬Wi-Fi的配置思路并没有为有线场景做扩展。实际定制时我们发现光靠系统设置里的“以太网”菜单连输入802.1X用户名密码的入口都没有。而且Android框架层也没有把EAPOL报文转给wpa_supplicant的通道等于说即便上层加了用户名密码字段服务层也不知道该怎么和交换机完成握手。所以这个补丁必须同时解决上层配置入口、配置持久化、底层EAPOL认证通道这三个问题。1.3 我的补丁思路概览综合评估下来我采用的方案是把有线网口交给wpa_supplicant的wired驱动去处理认证而不是在EthernetNetworkFactory里重新实现一套EAPOL协议栈。这样能够复用wpa_supplicant成熟的802.1X实现包括PEAP、MD5、TLS等EAP方法补丁范围也相对可控。具体拆成三块扩展EthernetManager的IpConfiguration.SecurityType增加802_1X枚举扩展EthernetConfigStore把用户名、密码、CA证书、身份等内容持久化到XML配置里在EthernetNetworkFactory里识别到802.1X配置后不再直接通过EthernetNetworkAgent建连而是先把网卡交由wpa_supplicant管理等认证完成后走正常网络流程。这个思路和部分Rockchip官方补丁的做法一致好处是上层逻辑改动少、认证协议不容易出岔子。2. 802.1X与Android有线网络的原理对照2.1 802.1X认证的基本流程802.1X认证的核心是端口访问控制把物理端口划分为受控和非受控两条通道。客户端Supplicant通过非受控端口发送EAPOL-Start报文交换机和认证服务器RADIUS之间走标准RADIUS协议交互最终在成功后再打开受控端口给设备分配IP地址。整个过程涉及三个角色客户端设备Supplicant也就是我们的RK3576开发板认证设备Authenticator也就是交换机接入端口认证服务器Authentication Server通常是RADIUS服务器或AC。调试时经常看到的现象是设备插了网线但网络图标一直打叉或者偶尔能获取到IP但很快又断开大多数时候都是EAPOL握手阶段卡住了。补丁里必须在Supplicant侧完整实现EAPOL状态机才能保证稳定对接交换机。2.2 Android 14以太网框架中安全类型的支持情况看packages/modules/NetworkStack/src/com/android/server/ethernet/EthernetNetworkFactory.java源码可以明显感觉到它只针对“有网线就发DHCP请求、拿不到IP就标记网络失败”这个逻辑设计。IpConfiguration在传递给EthernetNetworkAgent之前压根不会处理任何EAP信息。系统设置里的以太网配置界面正常情况下只有三个选项DHCP、静态IP、代理设置。补丁要加入的安全类型选项必须从EthernetManager接口一路穿透到设置App再存到EthernetConfigStore里。整个链路缺一不可。2.3 补丁中需要补的关键节点梳理代码后我发现补丁至少需要触及这几个关键节点IpConfiguration.SecurityType枚举定义IpConfiguration的Parcel序列化与反序列化EthernetConfigStore的XML读写逻辑EthernetNetworkFactory的网络创建逻辑EthernetTracker对配置变更的通知系统设置里以太网配置UI。除此之外还需要一个和wpa_supplicant交互的入口。Android的WifiSupplicant接口可以复用但它默认绑定的是Wi-Fi网卡名我们需要把它扩展到以太网接口并指定driver为wired。这一步是整个补丁里最容易出问题的地方。3. 补丁设计与源码改动3.1 框架层扩展EthernetManager的SecurityType在android.net.IpConfiguration里增加一个安全类型等于同时修改了一个被系统多处引用的基础类。最初我尝试直接复用Wi-Fi的WifiEnterpriseConfig把802.1X配置塞进IpConfiguration但这样会引入对Wifi框架的强依赖在系统服务层容易引发循环依赖或者类型转换问题。我最后选的是轻量方案在IpConfiguration中新增一个EnterpriseConfig内部字段只包含身份、匿名身份、密码、CA证书路径、EAP方法这几个基础字段够用且不会破坏原有序列化逻辑。public static class EnterpriseConfig implements Parcelable { public String identity ; public String anonymousIdentity ; public String password ; public String caCertPath ; public int eapMethod EapMethod.PEAP; public EnterpriseConfig() {} protected EnterpriseConfig(Parcel in) { identity in.readString(); anonymousIdentity in.readString(); password in.readString(); caCertPath in.readString(); eapMethod in.readInt(); } Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(identity); dest.writeString(anonymousIdentity); dest.writeString(password); dest.writeString(caCertPath); dest.writeInt(eapMethod); } }SecurityType枚举里增加802_1X并且保证Parcel读写和旧版本兼容。这样设置App就能把配置项传到系统服务层。3.2 服务层EthernetNetworkFactory对接802.1X配置EthernetNetworkFactory在拿到接口配置后原本会直接走createNetworkAgent流程。补丁里要做的是分支判断如果安全类型是802.1X先把网卡的IP配置清空调用wpa_supplicant接管网卡监听认证结果。核心逻辑可以简化为if (config.getSecurityType() IpConfiguration.SecurityType.NONE || config.getSecurityType() IpConfiguration.SecurityType.STATIC) { // 原生逻辑直接创建网络 } else if (config.getSecurityType() IpConfiguration.SecurityType.DOT1X) { // 先交给wpa_supplicant处理EAPOL认证 boolean authenticated mSupplicantBridge.startWired8021x( ifaceName, config.getEnterpriseConfig()); if (authenticated) { // 认证完成后重新走DHCP或者静态IP配置 setupNetworkAfterAuth(); } }这里有个细节当wpa_supplicant接管网卡后原来的EthernetNetworkFactory不能再继续监听这个网卡的link state否则可能重复创建网络。我采用的做法是在认证期间暂停该网卡的网络候选等认证成功后再恢复。3.3 系统应用层设置界面增加认证字段原生设置里的以太网配置需要扩展这里我用的是Settings模块的EthernetConfigActivity。补丁要增加一个安全类型下拉框当用户选择802.1X后把用户名、密码、CA证书、EAP方法等输入框显示出来。界面上的字段需要和框架层的EnterpriseConfig一一对应。代码改动不复杂但布局文件要重新整理尤其注意横竖屏切换时保留输入状态否则用户填一半密码切了个屏就全部丢掉了。字段样例认证方式PEAP / TLS / MD5身份匿名身份密码CA证书路径3.4 配置文件与IPC传递EthernetConfigStore会把配置写入/data/misc/ethernet/ipconfig.txt。补丁必须扩展它的write()和read()方法把新增的EnterpriseConfig一并序列化进去否则设备重启后802.1X配置全部丢失。序列化格式我沿用了XML结构保证老版本配置可以正常读取新字段缺省时按空值处理。ipconfig securityType802_1X/securityType enterprise identityuser01/identity passwordabcdef/password caCertPath/data/misc/ethernet/ca.pem/caCertPath eapMethodPEAP/eapMethod /enterprise staticIpConfig / /ipconfigIPC层面由于IpConfiguration已经实现了Parcelable新增字段会自动随Binder调用传递。只注意一点EthernetManager的接口如果是AIDL需要在AIDL文件里确认兼容否则服务端升级后客户端拿到的是空对象。4. 编译、打包与验证4.1 编译步骤RK3576 Android 14的编译流程比较成熟修改NetworkStack模块后不需要整包编译可以单独编译模块后在系统镜像里替换。source build/envsetup.sh lunch rk3576_xxx-userdebug m packages/modules/NetworkStack编译产物在out/target/product/rk3576_xxx/system/framework/下可以用adb push推入设备但更稳妥的做法是重打包system.img或者直接整编生成update.img刷机。毕竟框架层改动涉及系统签名如果不刷机验证可能会因为签名不一致导致系统服务起不来。设置模块的改动可以单独编译Settings APKm Settings4.2 用wpa_supplicant和EAPOL验证补丁编译进去后先用简单的PEAP认证环境验证。我在内网搭了一个基于freeRADIUS的认证服务交换机端口开启802.1X模式然后RK3576设备通过网线接入。设备端开启日志观察wpa_supplicant是否成功发起EAPOL握手logcat -s wpa_supplicant:E正常流程会依次看到EAPOL-START、EAP-REQUEST/IDENTITY、EAP-RESPONSE、EAP-SUCCESS的日志。如果卡在某个状态对照下面的排查表处理。4.3 与华为/深信服交换机对接的配置要点实际项目里客户侧的交换机大概率是华为或深信服。华为交换机配置802.1X认证时需要注意端口模式必须设置为authentication或auto模式不能用force-authorized否则设备发EAPOL报文交换机根本不响应。interface GigabitEthernet0/0/1 dot1x enable dot1x port-method portbased深信服AC配合华为交换机做802.1X认证的场景我也遇到过这类方案通常需要交换机把RADIUS请求指向AC设备端只是标准Supplicant。补丁里不需要针对AC做定制只要EAPOL握手能通过上层网络就能正常建立。5. 踩坑记录与常见问题5.1 ConnectivityManager网络评分导致有线网络反复连接补丁第一个版本测试时发现802.1X认证成功并且拿到IP后系统网络还是会在几秒内断开重连。看日志是EthernetNetworkAgent的network score被Wi-Fi无线网络压制导致ConnectivityService频繁切换网络。最后的解决办法是在认证成功后的有线网络agent上把NetworkCapabilities的NET_CAPABILITY_INTERNET和NET_CAPABILITY_NOT_VPN等能力标记完整并将NetworkAgentInfo的score调高。如果需求明确规定有线优先可以在EthernetTracker里固定score为80以上。5.2 认证成功但拿不到IP这个坑很隐蔽。wpa_supplicant认证成功后交换机会打开受控端口但如果网卡的DHCP客户端没有重新触发设备会一直停留在已认证但无IP的状态。补丁里必须在收到EAP-SUCCESS事件后主动调用DHCP重新协商。我采用的方式是监听wpa_supplicant的状态轮询当状态从COMPLETED切回INACTIVE时调用EthernetNetworkFactory的配置更新接口让网络重新走一遍DHCP流程。5.3 证书和CA校验问题EAP-TLS场景必须处理CA证书路径和私钥导入。Android设置App里选择CA证书时要注意/data/misc/etherne目录的SELinux上下文默认的ethernet_data目录没有给system_server写权限导致保存CA证书失败。解决方式是把证书目录的SELinux type改为和wifi证书一致或者直接在file_contexts里增加规则。PEAP场景虽然不强制客户端证书但服务器CA校验如果开启也必须导入服务端根证书。5.4 热插拔与配置持久化设备拔网线再插回后如果wpa_supplicant没有重新启动EAPOL状态机会卡在DISCONNECTED。需要补丁监听网卡link状态变化在link up时重新触发wpa_supplicant的reconnect命令。配置持久化的问题前面提过EthernetConfigStore不扩展的话重启后配置丢失。这个问题测试时特别容易忽视因为第一次开机配置后看起来都正常重启后才暴露。5.5 配合RTL8111等USB有线网卡时的驱动时序RK3576平台上如果外接USB转千兆网卡比如RTL8111/RTL8153插入瞬间的网卡枚举时序可能比系统服务初始化慢。EthernetNetworkFactory在初始化时会扫描已有网卡如果此时USB网卡还没ready后续插上时不会自动加入管理列表。补丁需要在DeviceStateListener或者网卡热插拔回调里动态添加新网卡另外wpa_supplicant的wired接口也不能提前绑定一个不存在的网卡名否则启动直接报错。这个问题的典型现象是上电开机后网线灯亮但系统里看不到有线网络拔插一次网线或重新插拔USB网卡又能恢复。补丁开发过程中最深的体会是Android的以太网栈虽然看起来简单但一旦牵扯到802.1X认证就不再是“设置里加个开关”这么简单。它要求你把上层配置、服务层网络管理、底层Supplicant状态机整个链路打通任何一环缺失都会导致认证失败或网络不稳定。如果你也在给RK3576或者其他Android 14平台做有线企业认证建议先梳理清楚原生Ethernet模块的调用链再动工改代码。我踩过的几个大坑已经列在上面了照着排查能省不少时间。最后再补充一点有条件的话最好在真实交换机上做一轮完整的EAP-PEAP和EAP-TLS测试模拟器和普通家用路由器验证不了边界情况。本文还有配套的精品资源点击获取
返回列表