Ubuntu上从零搭建FreeRADIUS EAP-TLS双向认证测试环境
简介这份文档面向需要在 Ubuntu 环境下搭建 802.1X 认证实验的网络运维与安全学习者聚焦 Freeradius 与 EAP-TLS 双向认证的完整落地流程。内容从环境准备讲起涵盖 Freeradius 与 openssl 安装、users 与 client.conf 配置、TLS 模块证书生成ca.pem、server.pem、server.key、client.p12、eap 文件参数调整、路由器 WPA 与 Radius 对接以及服务启动排错和终端证书导入测试形成一条可复现的实验链路。资源包为单个 docx 文档约 472KB便于离线阅读与按步骤对照操作。目前已有 2922 人学习适合希望理解证书签发、共享密钥匹配、端口占用与权限问题处理等关键细节的读者可作为搭建无线认证测试环境的参考手册。1. 为什么EAP-TLS双向认证总在证书环节翻车很多团队第一次搭EAP-TLS测试环境卡住的地方往往不是FreeRADIUS本身而是证书链。服务端证书、客户端证书、CA根证书三者的签发关系一旦搞混客户端就会在握手阶段直接断开日志里只留下一句含糊的TLS alert。EAP-TLS的核心是双向认证服务端验证客户端证书客户端也验证服务端证书任何一侧的证书链不完整或用途字段不对认证就失败。这套环境适合无线网络准入测试、802.1X认证联调、IoT设备证书认证验证等场景。在Ubuntu上搭建的好处是软件包齐全、日志清晰、调试工具链完整。下面从零开始把每一步的命令、配置和参数含义都拆开讲让你能直接复现一套可用的EAP-TLS测试环境。2. 环境准备与FreeRADIUS安装从裸机到可启动服务2.1 系统版本选择与网络前提Ubuntu版本建议用22.04 LTS或24.04 LTS这两个版本的软件源里FreeRADIUS版本较新对EAP-TLS的支持更完整。安装前确认机器有两块网络接口或至少一个可用的回环地址用于测试因为后续要用radtest和eapol_test做本地验证。如果是在虚拟机里做网络模式选桥接或NAT都行但要注意客户端测试机和服务端要能互相访问。先更新软件源并安装必要工具sudo apt update sudo apt install -y freeradius freeradius-utils openssl eapol_test这里装了四个包freeradius是服务端主程序freeradius-utils提供radtest等调试工具openssl用来生成证书eapol_test是wpa_supplicant自带的EAP测试客户端专门用来模拟802.1X认证。装完后检查服务状态sudo systemctl status freeradius如果显示active (running)说明服务已启动。默认配置下FreeRADIUS监听1812认证和1813计费端口配置文件在/etc/freeradius/3.0/目录下。先别急着改配置下一步先解决证书问题因为EAP-TLS没有证书根本跑不起来。2.2 目录结构与配置文件定位FreeRADIUS 3.0的配置目录结构比较清晰关键文件有这几个radiusd.conf是主配置clients.conf定义客户端NASusers是用户认证文件mods-enabled/目录下是各模块配置其中eap文件控制EAP认证方式sites-enabled/default定义虚拟服务器。EAP-TLS的配置主要改三个地方eap模块里指定证书路径clients.conf里放行测试客户端users里放测试账号。先备份原始配置sudo cp -r /etc/freeradius/3.0 /etc/freeradius/3.0.bak备份是个好习惯改崩了能快速回滚。接下来生成证书这是整个环境的地基。3. 证书体系搭建CA、服务端、客户端三套证书的生成与校验3.1 用openssl生成CA根证书EAP-TLS要求有一套完整的PKI。先建一个工作目录把CA、服务端、客户端的证书分开存放mkdir -p ~/eap-tls-lab/{ca,server,client} cd ~/eap-tls-lab/ca生成CA私钥和自签名根证书openssl genrsa -out ca.key 4096 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \ -subj /CCN/STTest/LTest/OTestLab/CNTestLab-CA第一条命令生成4096位RSA私钥第二条用私钥签发自签名根证书有效期3650天。-subj参数里CN字段是证书的通用名这里写TestLab-CA后面签发服务端和客户端证书时要用CA的证书和私钥来签。CA根证书是信任链的起点服务端和客户端都要信任它。3.2 签发服务端证书并配置扩展字段服务端证书需要包含serverAuth用途并且CN要和服务端的标识匹配。先生成私钥和证书签名请求CSRcd ~/eap-tls-lab/server openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr \ -subj /CCN/STTest/LTest/OTestLab/CNradius-server然后创建扩展配置文件指定证书用途cat server_ext.cnf EOF basicConstraints CA:FALSE keyUsage digitalSignature, keyEncipherment extendedKeyUsage serverAuth subjectAltName DNS:radius-server, IP:127.0.0.1 EOF用CA签发服务端证书openssl x509 -req -in server.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key \ -CAcreateserial -out server.crt -days 365 -extfile server_ext.cnf这里-CAcreateserial会生成一个序列号文件-extfile指定扩展字段。服务端证书的extendedKeyUsage必须是serverAuth否则FreeRADIUS加载证书时会报错。subjectAltName里加上IP和DNS方便不同测试场景使用。3.3 签发客户端证书并验证证书链客户端证书的流程类似但扩展字段要改成clientAuthcd ~/eap-tls-lab/client openssl genrsa -out client.key 2048 openssl req -new -key client.key -out client.csr \ -subj /CCN/STTest/LTest/OTestLab/CNtest-client cat client_ext.cnf EOF basicConstraints CA:FALSE keyUsage digitalSignature extendedKeyUsage clientAuth EOF openssl x509 -req -in client.csr -CA ../ca/ca.crt -CAkey ../ca/ca.key \ -CAcreateserial -out client.crt -days 365 -extfile client_ext.cnf签发完成后用openssl验证证书链是否正确openssl verify -CAfile ../ca/ca.crt server.crt openssl verify -CAfile ../ca/ca.crt client.crt两条命令都应返回OK。如果报错检查CA证书路径和扩展字段。证书生成后把服务端证书和私钥复制到FreeRADIUS的证书目录sudo cp server.crt server.key /etc/freeradius/3.0/certs/ sudo cp ../ca/ca.crt /etc/freeradius/3.0/certs/ sudo chown freerad:freerad /etc/freeradius/3.0/certs/server.* sudo chmod 640 /etc/freeradius/3.0/certs/server.key权限设置很关键私钥不能让其他用户读取否则FreeRADIUS启动时会拒绝加载。4. FreeRADIUS配置EAP-TLS模块、虚拟服务器与客户端放行4.1 修改eap模块指向证书编辑/etc/freeradius/3.0/mods-enabled/eap找到tls-config段修改以下参数sudo nano /etc/freeradius/3.0/mods-enabled/eap在tls-config tls-common段内设置private_key_file /etc/freeradius/3.0/certs/server.key certificate_file /etc/freeradius/3.0/certs/server.crt ca_file /etc/freeradius/3.0/certs/ca.crt dh_file /etc/freeradius/3.0/certs/dhdh_file是Diffie-Hellman参数文件如果不存在需要生成openssl dhparam -out /etc/freeradius/3.0/certs/dh 2048生成2048位DH参数可能需要一两分钟。然后在eap模块的default_eap_type处确认是tls并确保tls配置段被启用。FreeRADIUS 3.0默认已经启用了EAP-TLS但证书路径要改成自己的。4.2 配置clients.conf放行测试客户端EAP-TLS认证时NAS网络接入服务器会向RADIUS服务端发起请求。测试阶段可以用eapol_test模拟NAS需要在clients.conf里添加客户端条目sudo nano /etc/freeradius/3.0/clients.conf在文件末尾添加client test-client { ipaddr 127.0.0.1 secret testing123 require_message_authenticator no nas_type other }ipaddr是客户端IPsecret是共享密钥eapol_test配置里要填一样的值。require_message_authenticator设为no是为了兼容测试工具生产环境建议开启。4.3 配置users文件与虚拟服务器在users文件里添加测试账号sudo nano /etc/freeradius/3.0/users添加一行testuser Cleartext-Password : testpass Reply-Message : EAP-TLS Auth OKEAP-TLS认证时客户端证书的CN会作为用户名但users文件里的条目仍然需要存在否则授权阶段会失败。然后检查sites-enabled/default里的authorize、authenticate、post-auth段是否包含eap模块。默认配置已经包含但确认一下sudo grep -n eap /etc/freeradius/3.0/sites-enabled/default应该能看到eap出现在authorize和authenticate段。配置完成后重启服务sudo systemctl restart freeradius sudo systemctl status freeradius如果启动失败用freeradius -X以调试模式前台运行能看到详细的错误信息。5. 避坑与排查EAP-TLS认证失败的五个典型场景5.1 证书用途字段错误导致握手失败现象eapol_test连接后立即断开FreeRADIUS日志显示TLS alert certificate unknown或unsupported certificate purpose。原因服务端证书的extendedKeyUsage不是serverAuth或者客户端证书不是clientAuth。解决用openssl x509 -in server.crt -text -noout查看扩展字段确认用途正确。重新签发时在扩展文件里明确写extendedKeyUsage。5.2 私钥权限过宽导致服务拒绝加载现象FreeRADIUS启动时报Failed to load private key但文件明明存在。原因私钥文件权限是644或属主不是freerad。解决chown freerad:freerad server.keychmod 640 server.key。FreeRADIUS对私钥权限检查很严格这是安全设计。5.3 CA证书路径配置错误导致客户端不信任服务端现象客户端日志显示unable to get local issuer certificate。原因eap模块里的ca_file指向了错误的路径或者客户端没有加载CA证书。解决确认ca_file指向/etc/freeradius/3.0/certs/ca.crt客户端eapol_test配置里ca_cert参数也要指向同一个CA证书。5.4 共享密钥不匹配导致认证请求被丢弃现象eapol_test发送请求后没有任何响应FreeRADIUS日志里看不到认证记录。原因clients.conf里的secret和eapol_test配置里的secret不一致。解决两边都改成testing123重启服务后再试。共享密钥是RADIUS协议的基础不匹配时服务端直接丢弃包不会有明显报错。5.5 时间不同步导致证书有效期校验失败现象证书明明在有效期内但认证时报certificate has expired。原因服务端和客户端系统时间偏差过大或者证书的notBefore时间晚于当前时间。解决用date命令检查两边时间用ntpdate或chrony同步。虚拟机挂起后恢复时间容易漂移这是常见坑。6. 用eapol_test验证双向认证并抓包分析握手过程6.1 编写eapol_test配置文件eapol_test需要一个配置文件指定服务端地址、共享密钥、客户端证书等cat ~/eap-tls-lab/eapol_test.conf EOF network{ ssidtest-ssid key_mgmtWPA-EAP eapTLS identitytestuser ca_cert/home/user/eap-tls-lab/ca/ca.crt client_cert/home/user/eap-tls-lab/client/client.crt private_key/home/user/eap-tls-lab/client/client.key private_key_passwd } EOF注意ca_cert、client_cert、private_key要用绝对路径。identity填users文件里的用户名。然后运行eapol_test -c ~/eap-tls-lab/eapol_test.conf -a 127.0.0.1 -s testing123 -p 1812-a指定RADIUS服务端地址-s是共享密钥-p是认证端口。如果认证成功最后会输出SUCCESS。失败时看输出的TLS握手信息能定位到具体哪一步出错。6.2 用tcpdump抓包分析EAP-TLS握手想深入理解握手过程可以在另一个终端抓包sudo tcpdump -i lo -w ~/eap-tls-lab/eap-tls.pcap port 1812然后运行eapol_test完成后用wireshark打开pcap文件。过滤eap协议能看到EAP-Request/Identity、EAP-Response/Identity、TLS Client Hello、Server Hello、Certificate、Client Key Exchange等报文。重点看Certificate报文里服务端和客户端互相交换证书的过程以及最后EAP-Success报文。抓包是排查认证问题最直接的手段比看日志更直观。6.3 验证双向认证是否真正生效双向认证的关键是双方都验证对方证书。可以做两个反向测试第一把客户端证书换成用另一个CA签发的认证应该失败日志显示unknown CA第二把服务端证书换成客户端不信任的CA签发的客户端应该拒绝连接。这两个测试都通过说明双向认证配置正确。另外在FreeRADIUS的post-auth段可以加日志记录证书CNpost-auth { if (TLS-Client-Cert-Common-Name) { update reply { Reply-Message : Client CN: %{TLS-Client-Cert-Common-Name} } } }这样认证成功后能看到客户端证书的CN确认服务端确实验证了客户端证书。我一般会在证书生成脚本里加一个自检步骤每次签发完自动跑openssl verify避免手工操作漏掉扩展字段。这套环境搭好后后续换证书、加用户、调EAP参数都有章可循不用每次从头踩坑。希望帮到你。本文还有配套的精品资源点击获取