Ubuntu + FreeRADIUS 3.0 搭建 EAP-TLS 双向认证:从证书生成到终端联调避坑指南

简介:面向网络运维与无线认证初学者的实操文档,聚焦在 Ubuntu 系统上使用 Freeradius 搭建 802.1X EAP-TLS 双向认证测试环境这一典型场景,帮助读者理解 RADIUS 服务与证书体系如何协同完成设备接入认证。资源包内仅含 1 个 docx 文件,约 472KB,以图文步骤形式组织内容,便于边看边在虚拟机或实体机上复现。文档从环境准备讲起,依次覆盖 Freeradius 与 openssl 的安装、users 与 client.conf 的配置、TLS 模块参数调整,以及通过 make 生成 CA 根证书、服务器证书与客户端 p12 证书的完整流程,并给出路由器侧 WPA 与 RADIUS 参数对接方法,最后说明服务启动与客户端证书导入测试。对于需要排查证书权限、1812 端口占用等常见问题的读者,文中也提供了对应提示与处理思路。目前已有 2924 人学习,适合作为 EAP-TLS 认证实验的入门参考与配置对照手册。

1. 从一次“证书全绿却连不上”说起:Ubuntu + FreeRADIUS 搭 EAP-TLS 到底难在哪

上周帮一个做无线终端的团队复现 802.1X 认证,环境是 Ubuntu 加 FreeRADIUS,目标是跑通 EAP-TLS 双向认证。证书make出来一堆.pem、.p12,看着全绿,结果终端一连接就卡在“正在验证身份”,服务端日志里连个像样的报错都没有。这种场景在物联网、企业无线接入的联调里太常见了:FreeRADIUS 装起来一条apt命令,真正耗时间的是证书链、eap模块、clients.conf和路由器共享密钥这几处对不上。装不好不会报“你配错了”,只会静默超时,新手很容易怀疑人生。这篇笔记按我实际落地的顺序写:先列清版本和环境,再一步步装、配、启,最后给一套能自证的验证方法,适合第一次搭 EAP-TLS 测试环境、或者搭到一半卡住的开发者照着走。

2. 环境与版本先对齐:Ubuntu、FreeRADIUS 3.0 和 OpenSSL 的取舍

2.1 系统与网络模式:桥接不是可选项

这套环境对系统版本不挑,Ubuntu 20.04 / 22.04 都能跑,关键是网络模式。如果 FreeRADIUS 跑在虚拟机里,网络连接方式必须改成桥接,不能留在 NAT。原因很直接:认证终端(手机、路由器、物联网设备)要能直接访问到 RADIUS 服务器的 1812 端口,NAT 模式下终端和服务器不在同一广播域,认证报文根本到不了。我一般会在装之前先确认三件事:

# 确认系统版本,20.04 和 22.04 的包路径一致,都是 /etc/freeradius/3.0 lsb_release -a # 确认网卡拿到的是和终端同网段的地址(桥接后通常是 192.168.x.x) ip addr show # 确认 1812/1813 端口没有被别的 radius 服务占用 ss -lunp | grep -E '1812|1813'

第一行看发行版,第二行确认桥接后 IP 落在终端所在网段,第三行是提前排雷——很多人机器上残留过别的认证服务,端口被占,后面freeradius -X会直接起不来。这里有个版本差异要提前说清:FreeRADIUS 3.0 的配置目录是/etc/freeradius/3.0/,而 2.x 是/etc/freeradius/,网上大量老教程还停留在 2.x 路径,照抄会找不到文件。Ubuntu 官方源里现在默认给的就是 3.0 系列,直接用源安装即可,不用自己编译。

2.2 安装 FreeRADIUS 与 OpenSSL:一条命令背后的依赖

安装本身不复杂,但要用 root 身份,并且先更新 apt 索引,否则可能装到旧包或者依赖解析失败:

sudo su # 切到 root,后续配置都在 root 下做 apt update # 刷新软件源索引 apt-get install freeradius openssl # 装 radius 服务和证书工具

apt update不能省,源索引过期时apt-get install会报依赖版本冲突。openssl单独列出来是因为后面certs目录里的 Makefile 生成证书时依赖它,虽然通常作为依赖被带上,但显式装一遍更稳。装完可以用freeradius -v看版本,确认是 3.0.x。另外 vim 不一定预装,后面要编辑多个配置文件,顺手补上:

apt-get install vim

这一步没什么玄学,但有个血泪经验:不要在装完立刻改配置,先让服务以默认配置跑一次freeradius -X,确认能到Ready to process requests,再动文件。这样一旦后面出问题,你能确定是配置改坏的,而不是安装本身有问题。

3. 配置 FreeRADIUS 三件套:users、clients.conf 与 eap 模块

3.1 users 文件:先放一个明文测试账号

FreeRADIUS 3.0 的所有配置都在/etc/freeradius/3.0/下。第一步先配一个最简单的测试账号,用来验证服务本身是通的:

cd /etc/freeradius/3.0/ vim users

在文件末尾添加一行:

Testing Cleartext-Password := "password"

Testing是身份名称,password是密码,两个都可以自定义,但要注意大小写和引号——Cleartext-Password是固定属性名,值必须用双引号包起来。这个账号在 EAP-TLS 里其实用不到(TLS 靠证书认证,不走密码),但它的价值在于:当你怀疑是证书问题时,可以先用这个账号跑一次 PAP 认证,把“服务通不通”和“证书对不对”两个问题拆开。我一般会保留这个测试账号到整个环境验证完再删。

3.2 clients.conf:共享密钥和终端地址必须成对改

clients.conf定义谁有权向 RADIUS 服务器发认证请求,这里配的是认证终端(通常是路由器或 AP)的地址和共享密钥:

vim clients.conf

加入一个 client 块:

client client1 { ipaddr = 192.168.1.1 secret = testing123 require_message_authenticator = no }

client1是别名,随便起;ipaddr必须填认证终端的真实地址,填错就是静默丢弃报文;secret是共享对称密钥,路由器的 RADIUS 配置里要填一模一样的值,这是最容易翻车的地方——两边差一个字符,日志里只会显示认证失败,不会告诉你密钥不匹配。require_message_authenticator = no建议保持 no,旧版本协议设备不一定带 Message-Authenticator 属性,设成 yes 会把老设备直接挡在门外。改完这个文件,后面路由器配置里的密钥要同步改,别只改一边。

3.3 eap 模块:把默认认证方式切到 TLS

EAP-TLS 的核心在mods-enabled/eap这个文件里,它决定了默认的 EAP 方法和证书路径:

cd /etc/freeradius/3.0/mods-enabled/ vim eap

需要改的关键参数:

eap { default_eap_type = tls tls-config tls-common { private_key_password = whatever private_key_file = ${certdir}/server.key certificate_file = ${certdir}/server.pem ca_file = ${cadir}/ca.pem dh_file = ${certdir}/dh } }

default_eap_type = tls把默认方法从 PEAP 切成 TLS,这是双向认证的前提。private_key_password默认是whatever,和后面生成证书时的私钥密码对应,改证书密码就要同步改这里。${certdir}和${cadir}是 FreeRADIUS 内置变量,分别指向证书目录和 CA 目录,不用写死绝对路径。dh_file是 Diffie-Hellman 参数文件,make时会一起生成。这里有个细节:mods-enabled下的文件通常是mods-available的软链接,直接编辑没问题,但如果你从别处拷了配置覆盖,记得确认软链接还在,否则模块根本不加载。

4. 证书生成与权限:certs 目录里 make 出来的东西怎么用

4.1 make 一次生成全套证书

FreeRADIUS 自带一套证书生成脚本,在certs目录下直接make:

cd /etc/freeradius/3.0/certs make

跑完会生成一整套文件,常用的几个:

文件用途关键点
ca.pem自签发根证书服务器和客户端互相验证的信任锚
server.pem服务器证书配在 eap 模块的 certificate_file
server.key服务器私钥密码默认 whatever,配在 private_key_password
client.p12客户端个人证书含证书+私钥,密码 whatever,导入终端用
dhDiffie-Hellman 参数配在 dh_file

client.p12是给终端用的,需要导出到设备上安装。这里要注意:make生成的证书有有效期,默认几年,测试环境够用;如果之前make过又改了配置,建议先make clean再make,避免新旧证书混在一起导致验证失败。

4.2 权限问题:那个“读取证书失败”的经典报错

第一次freeradius -X启动时,很可能看到证书读取权限相关的报错。原因是make出来的私钥文件权限过严,FreeRADIUS 运行用户读不到。在certs目录下执行:

chmod 777 ca.pem dh server.key server.pem chmod o-w ca.pem dh server.key server.pem

第一行放开读权限让服务能读到,第二行去掉其他用户的写权限,避免私钥被随意篡改。这是测试环境的做法,生产环境应该用更细的属主和权限控制,但测试阶段先让服务跑起来更重要。改完权限再启动,如果还报错,往下看端口占用那条。

5. 启动、联调与避坑:从 freeradius -X 到终端连上热点

5.1 调试模式启动与端口占用

配置改完,用调试模式启动,所有认证过程会打在终端上,这是排查 EAP-TLS 最有效的手段:

freeradius -X

看到Ready to process requests才算启动成功。如果报 1812 端口被占用,说明有残留的 radius 进程或别的服务占着端口,最省事的做法是重启服务器再启动:

reboot # 重启后重新执行 freeradius -X

-X是调试模式,前台运行、输出详细日志,正式跑可以改用service freeradius start,但联调阶段一定用-X,否则出问题你什么都看不到。

5.2 路由器侧配置:WPA 与 RADIUS 参数对齐

把路由器用网线连上,登录管理页面(示例地址 192.168.1.1),无线加密方式选 WPA 系列,认证方式选 RADIUS/802.1X,然后填两项:RADIUS 服务器地址填 FreeRADIUS 所在机器的 IP,共享密钥填clients.conf里那个secret的值。保存后路由器会开始向服务器发认证请求。这一步的坑在于:路由器页面上的“密钥”字段有的叫 Shared Secret,有的叫 RADIUS 密码,本质都是同一个值,必须和clients.conf完全一致。

5.3 常见问题排查:四条踩坑记录

现象:终端一直显示“正在验证身份”,服务端日志无报错。原因:终端和服务器不在同一网段,或虚拟机还是 NAT 模式,认证报文到不了 1812 端口。 解决:确认虚拟机网络为桥接,ip addr看服务器 IP 与终端同网段,必要时在服务器上tcpdump -i any port 1812看有没有收到包。

现象:freeradius -X启动即退出,提示证书读取失败。原因:server.key等文件权限过严,运行用户读不到。 解决:按 4.2 节执行chmod 777再chmod o-w,重启服务。

现象:启动报 1812 端口被占用。原因:残留 radius 进程或其他服务占用端口。 解决:reboot后重新freeradius -X,或ss -lunp | grep 1812找到进程处理掉。

现象:终端证书装好了,连接仍失败,日志提示 TLS 握手错误。原因:client.p12导入不完整,或终端时间与证书有效期不匹配。 解决:重新导出并安装client.p12,确认终端系统时间正确,检查eap文件里private_key_password与生成证书时的密码一致。

6. 装完怎么验证跑通:三步自证与一个习惯

环境搭完,别急着说“应该好了”,按下面三步自证,每一步都能独立定位问题。

第一步,服务端自检。freeradius -X保持前台运行,另开一个终端用radtest发一个明文认证,验证 users 和 clients 配置是否正确:

# 语法:radtest 用户名 密码 localhost 0 共享密钥 radtest Testing password 127.0.0.1 0 testing123

返回Access-Accept说明服务、users、clients 三件套是通的。这一步过了,再怀疑证书才有意义。

第二步,证书链自检。用 openssl 验证服务器证书和 CA 的对应关系:

openssl verify -CAfile /etc/freeradius/3.0/certs/ca.pem \ /etc/freeradius/3.0/certs/server.pem

输出OK说明证书链没问题。如果这里就失败,后面终端怎么连都不会成功。

第三步,终端实测。把client.p12导入设备,连接路由器广播的热点,认证方式选 EAP-TLS,CA 证书可以不选(测试环境用自签根证书),客户端证书选刚导入的那个。连接过程中盯着freeradius -X的输出,能看到 TLS 握手、证书交换、最终Access-Accept的完整链路,哪一步断了日志里一目了然。

验证项命令/操作通过标准
服务与账号radtest返回 Access-Accept
证书链openssl verify输出 OK
端到端终端连热点日志出现 Access-Accept

从那以后我每次搭这类认证环境,都强制先跑radtest再碰证书,把“服务通不通”和“证书对不对”彻底拆开,省掉大量瞎猜的时间。这套 Ubuntu + FreeRADIUS 3.0 的 EAP-TLS 测试环境,按上面的顺序走一遍,基本能一次跑通;卡住的时候优先看-X的实时日志,它比任何文档都直接。希望帮到你。

本文还有配套的精品资源,点击获取