CentOS7_openwrt_用hostapd做radius服务器为WiFi提供802.1X企业认证
来源: https://www.cnblogs.com/osnosn/p/10593297.html 来自osnosn的博客
写于: 2019-03-27.
前言
家里的WiFi一般是用WPA2认证,密码只有一个,泄漏了,家里所有设备都要换密码。
再加上现在密码共享软件的流行,如“wifi万能钥匙”,WPA2的密码也不安全了。
本文介绍如何搭建一个EAP的企业认证WiFi。支持N个账号(N>=1),可以做到一人一个账号。
一个账号泄漏,改掉这个账号的密码,或者删除这个账号就行。
如果你不嫌麻烦,还可以发放一人一个证书认证上网。证书本身有过期时间的,还能吊销。
过期证书或被吊销证书,是不能登陆WiFi的。
支持 EAP-PEAP(msCHAPv2) 用户账号认证。用户账号存于文本文件中。
EAP-TLS证书认证,证书自行生成,可以吊销单个证书而阻止再次连接。
参考
本文参考了几位大神的文章:
其他链接
- hostapd 源码.文件树,
- openwrt 有线wired802.1x认证
- hostapd 代码分析-完全的802.1X认证过程(radius服务器)
- 搭建openwrt企业级认证-快速漫游的简单过程与常见问题_802.11r_EAP_FT-EAP_hostapd operation not permited_no r0kh matched
- 此文提到openwrt可以为 WiFi设置多个 PSK key
Private PSK (PPSK) function on hostapd,
Dynamic VLANs without RADIUS only works for 1 SSID,
Individual per-passphrase/per-MAC Wifi VLANs using wpa_psk_file (no RADIUS required), - 此文提到,可以为 WiFi设置多个 radius 服务器IP,但要修改openwrt的内置脚本。
Hostapd config Multiple RADIUS servers,
安装配置-centos7
安装 hostapd 软件包
- 我用的是CentOS7.
yum install hostapd我装的版本是2.6- 进入
/etc/hostapd/目录。 - 创建以下三个文件:
hostapd.conf,hostapd.eap_user,hostapd.radius_clients。 - 根据下文提示的链接,创建所需的证书。
hostapd -dd /etc/hostapd/hostapd.conf前台运行,测试一下。按ctrl-c退出。service hostapd start启动服务正式工作。
hostapd.conf
参考官方文档 hostapd.conf,
# hostapd.conf
# All path MUST be absolute path.
# 文件中所有配置的路径,要使用绝对路径。hostapd不认相对路径。
driver=none
ieee8021x=1
eap_server=1
eap_user_file=/etc/hostapd/hostapd.eap_user
radius_server_clients=/etc/hostapd/hostapd.radius_clients
radius_server_auth_port=1812
ca_cert=/etc/hostapd/ca_cert+crl.pem
server_cert=/etc/hostapd/server_cert.pem
private_key=/etc/hostapd/server_key.pem
# 备用服务器证书配置,主要用于同时启用RSA和ECC公钥。但可能有兼容性问题。
#server_cert2=/etc/hostapd/server_cert-ecc.pem
#private_key2=/etc/hostapd/server_key-ecc.pem
# 0 = do not verify CRLs (default)
# 1 = check the CRL of the user certificate
# 2 = check all CRLs in the certificate path
check_crl=1
# logger set -1 == all
# bit 0 (1) = IEEE 802.11
# bit 1 (2) = IEEE 802.1X
# bit 2 (4) = RADIUS
# bit 3 (8) = WPA
# bit 4 (16) = driver interface
# bit 5 (32) = IAPP
# bit 6 (64) = MLME
logger_syslog=0
#logger_syslog=6
logger_syslog_level=2
logger_stdout=0
#logger_stdout=-1
logger_stdout_level=2
# ---以下的配置项,未测试---
# 忽略user证书的有效期,禁用v1.0,v1.1,启用v1.3
#tls_flags=[DISABLE-TIME-CHECKS][DISABLE-TLSv1.0][DISABLE-TLSv1.1][ENABLE-TLSv1.3]
# 缓存OCSP装订,请看官方文档。Cached OCSP stapling response (DER encoded)
#ocsp_stapling_response=/tmp/ocsp-cache.der
hostapd.eap_user
参考官方文档 hostapd.eap_user,
# hostapd.eap_user
# Phase 1 users
# 指定匿名身份, 写多行, 按顺序匹配。
#"user4" TTLS
#"user5" TLS
# `*` 表示,匿名身份随便写,只能有一行,因为它一定会被匹配。后续的配置行失效。因为后续行,不会被匹配。
# `*` anonymous identities: input anything is OK.
#* PEAP,TLS,TTLS
* PEAP,TLS
# Phase 2 users
# MSCHAPV2 用于PEAP
# TTLS-PAP,TTLS-MSCHAP,TTLS-MSCHAPV2 用于TTLS
"user1" MSCHAPV2 "pass1" [2]
"user2" MSCHAPV2 "pass2" [2]
# 上面给自家用,下面给客人用
"user3" MSCHAPV2 "pass3" [2]
"tuser4" TTLS-MSCHAPV2 "tpass4" [2]
如果 仅需要PEAP, 就写
* PEAP,下面写账号,一行一个账号。
如果 仅需要TLS, 就写* TLS,下面的账号就不需要了,写了也没用,不会用到。
此项配置不能写成两行,hostapd不认,一定要写成一行* PEAP,TLS,多种认证方式用逗号分隔。
hostapd.radius_clients
# hostapd.radius_clients
127.0.0.1 key1234
192.168.0.0/16 key1234
#192.168.2.0/24 key1234
#0.0.0.0/0 key5678
创建证书
- 如果要创建临时的测试证书,【参考这篇,证书创建部分】。
- EAP-TLS 认证中用到的证书,见我写的另一文 "用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)"。
- 创建证书的另一篇【用certtool生成证书(CA证书,服务器证书,用户证书)】
- 也可以在网上申请免费的证书,作为服务器证书。做PEAP, EAP-TLS认证都行。做EAP-TLS的用户证书,需要用自签名CA生成。
见【其他证书测试】
网上申请证书,见【去freessl.org申请免费ssl服务器证书_acme.sh脚本_证书自动化_LetsEncrypt】
设置 WiFi 接入点的认证方式
AP设备的认证设置,选择 WAP2-EAP。
详细的AP设备的认证设置,客户端的连接设置,请参看页头大神的文章。
安装配置完成
其他搭建方法-openwrt
用SDK重新编译hostapd
适用 op22.03 或者更早的版本
-
如果你没有Linux(CentOS,Debian)机器。可以仅用一个OpenWRT的路由器搭建WiFi的企业认证:
请参看我写的另一文:Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企业级无线认证及 FreeRadius3 -
OpenWRT也可以用hostapd做radius服务器。需要您会使用SDK重新编译hostapd-full软件包。
参考【创建编译环境_编译OPENWRT固件_用SDK为官方固件编译第三方软件】,【在Openwrt上利用hostapd进行EAP-TLS认证】,
op-18.06 改package/network/services/hostapd/Makefile,
其他版本, 修改feeds/base/package/network/services/hostapd/Makefile,
无需修改PKG_RELEASE:=xx, 可以顺利的替换。remove 旧的,再 install 新的。
对于19.07.8的SDK, 是101行。对于21.02.1的SDK, 是108行。对于22.03.0是106行。对于23.05.2是103行。
对于22.03,还要把PKG_RELEASE改的比官版的大一点。否则装不上。- 不改也行,安装包时,不要
opkg update并且rm -f /var/opkg-list/*就可以安装。
还有个办法,强制装本地 ipk文件,opkg -f /dev/null install xxxxx.ipk
后面增加
CONFIG_DRIVER_NONE=y CONFIG_RADIUS_SERVER=y,变成以下的样子。ifeq ($(SSL_VARIANT),openssl) ... ifeq ($(LOCAL_VARIANT),full) DRIVER_MAKEOPTS += CONFIG_OWE=y CONFIG_SUITEB192=y CONFIG_AP=y CONFIG_MESH=y CONFIG_DRIVER_NONE=y CONFIG_RADIUS_SERVER=y endif或者修改 "feeds/base/package/network/services/hostapd/files/hostapd-full.config" 和 "wpa_supplicant-full.config" 把这几项加进去。
make menuconfig 中勾上 hostapd-openssl,在 "Network"->"WirelessAPD" 中找。
make menuconfig 中勾上 wpad-openssl,在 "Network"->"WirelessAPD" 中找。
然后编译 hostapd 软件包。make package/hostapd/compile V=s -j2。
完成后,在 bin/packages/.... 目录中,可以找到 hostapd-openssl_xxxx.ipk 文件。
完成后,在 bin/packages/.... 目录中,可以找到 wpad-openssl_xxxx.ipk 文件。
有wifi设备的路由,会安装 wpad。而 wpad 包含 hostapd。 - 不改也行,安装包时,不要
-
在路由器中, 用新编译的,替换掉原版的 hostapd-openssl(无wifi硬件) 或 wpad-openssl(有wifi硬件) 。
-
按照前文,创建证书,创建三个配置文件:
hostapd.conf,hostapd.eap_user,hostapd.radius_clients -
/usr/sbin/hostapd -B /.xx./hostapd.conf单独启动一个进程,提供radius服务。
把这个启动命令,放在/etc/rc.local的最后。 -
配置路由器的WiFi认证,使用WPA2-EAP模式。
-
这篇帖子的做法,更好: 【OpenWrt 用 hostapd 作为 Radius 服务器配置 WPAx-EAP 认证】
- 在op的 SDK 目录中,修改
# vim feeds/base/package/network/services/hostapd/files/hostapd-full.config # 找到并启用这两行 CONFIG_DRIVER_NONE=y CONFIG_RADIUS_SERVER=y - 编译wpad-openssl 或 hostapd-opensssl 软件包。
make package/hostapd/compile V=s -j2 - 按照前文,创建证书,创建三个配置文件。
hostapd.conf,hostapd.eap_user,hostapd.radius_clients - op中,新建系统服务 "/etc/init.d/hostapd-radius"
#!/bin/sh /etc/rc.common START=90 USE_PROCD=1 NAME=hostapd-radius start_service() { if [ -x "/usr/sbin/hostapd" ]; then procd_open_instance hostapd-radius procd_set_param command /usr/sbin/hostapd -s /etc/hostapd/hostapd.conf procd_set_param respawn 3600 1 0 [ -x /sbin/ujail -a -e /etc/capabilities/wpad.json ] && { procd_add_jail hostapd-radius procd_set_param capabilities /etc/capabilities/wpad.json procd_set_param user network procd_set_param group network procd_set_param no_new_privs 1 } procd_close_instance fi } - 启用并启动服务。
/etc/init.d/hostapd-radius enable /etc/init.d/hostapd-radius start
- 在op的 SDK 目录中,修改
用openwrt自带的hostapd-radius
相关帖子【Run wpad/hostapd as RADIUS server (wpad-openssl)】。
适用 op23.05, op24.10, 或更晚的版本。
- 对于op23.05, 已经启用
CONFIG_RADIUS_SERVER=y但没有启用CONFIG_DRIVER_NONE=y。
openwrt源码中, 新增了package/network/services/hostapd/src/hostapd/radius.c,
已经提供了 hostapd-radius 命令,配置文件在 /etc/radius/。可以单独提供radius服务。 - 没找到官方使用文档,只能靠猜。(2025-05)
- 安装
opkg install wpad-openssl或者hostapd-openssl, 系统则包含hostapd-radius命令。 - radius服务的配置在
/etc/config/radius文件中,- 修改
/etc/config/radius中的为option disabled '0'激活服务,
或用uci set radius.@radius[0].disabled='0';uci commit radius;激活服务。 - 自行创建证书
/etc/radius/ca.pem,/etc/radius/cert.pem,/etc/radius/key.pem,
分别是 CA证书,服务器证书,服务器私钥。 /etc/radius/client配置内容显而易见。此文件修改后,需要service radius restart才生效。(reload不行)#0.0.0.0/0 key12345 127.0.0.1 key12345 192.168.0.0/16 key12345/etc/radius/user格式json,此文件修改后,立即生效,无需restart或reload。{ "phase1": { "users": { //可选项, 不指定用户,可以删除整个"users" "gst3": { //用户名 //在这里指定vlan-id,似乎无效 "methods":["TLS"] } }, "wildcard": [ { "name": "*", "methods": [ "PEAP","TLS" ] } ] }, "phase2": { "users": { "gst7": { //用户名1 "methods":["MSCHAPV2"], //"radius":["test"], //不知道怎么取值,不知道作用,只知道是字符串数组 //"vlan-id": 20, //可选项,有效,需要其他网络配置的配合 //"max-rate-up":1001, //可选项,有效,不知道怎么用 //"max-rate-down":1002, //可选项,有效,不知道怎么用 "password": "def123" //或者用"hash"和"salt"作为密码, 内容都是hex字符串,(未测试,不知道怎么用) }, "gst9": { //用户名2 ... //"methods","password",配置 } } } }
- 修改
- 配置好之后,
service radius restart启动服务。或者重启整个openwrt。 - 测试,参考 Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企业级无线认证及 FreeRadius3,搜索 eapol-test。
- 使用 eapol-test 命令,测试 PEAP 认证成功。(2025-05测)
- 使用 eapol-test 命令,测试 TLS 认证成功。(2025-05测)
eapol-test测试hostapd-radius
- 对 openwrt24的hostapd-radius 测试
- 为了可以看到服务端的log信息。
service radius start #作为服务执行,log被丢弃,看不到 COLUMNS=256 ps|grep radius #得到,完整的命令行参数 service radius stop # 手工执行,会输出所有log到终端,按 CTRL-C停止运行。 /usr/sbin/hostapd-radius -C /etc/radius/ca.pem -c /etc/radius/cert.pem -k /etc/radius/key.pem -s /etc/radius/clients -u /etc/radius/users -p 1812 -P 1813 -i OpenWrt - 准备的证书,都是 prime256v1/secp256r1 算法的 ecc证书。
- 自签名 CA_self(ecc) 签发 server1(ecc) 和 user1(ecc) 证书
- letsencrypt 申请的 ISRG Root X1 -> E5 -> mydomain2(ecc)
- 使用 mydomain2 证书,签发 user2(ecc) 证书。
- letsencrypt 申请的 ISRG Root X1 -> E5 -> mydomain3(ecc)
- letsencrypt 申请的 ISRG Root X1 -> E5 -> mydomain4(ecc,已过期)
- letsencrypt 申请的 ISRG Root X1 -> E6 -> mydomain6(ecc)
- mydomain2,3,6 是完全不同的域名,各自单独从 letsencrypt申请的域名证书。
mydomain2和 4是同一个域名,4已经过期。
- peap 测试 (2025-08测)
radius
ca_cert, server+keyeapol-test
不设置ca_certCA_self, server1 用户名+密码 认证通过 E5, mydomain2+E5 用户名+密码 通过 X1, mydomain2+E5 用户名+密码 通过 CA_self, mydomain2+E5 用户名+密码 通过 CA_self, mydomain4+E5 用户名+密码 通过, 显示服务器证书过期 - tls 测试 (2025-08测)
radius
ca_cert, server+keyeapol-test
不设置ca_certCA_self, server1 user1 通过 CA_self, mydomain2+E5 user1 通过 CA_self, mydomain6+E6 user1 通过 E5, mydomain2+E5 user1 失败FAIL 证书不匹配 E5, mydomain2+E5 mydomain2 失败FAIL 证书链不完整 E5, mydomain2+E5 mydomain3 失败FAIL 证书链不完整 E5, mydomain2+E5 mydomain3+E5 失败FAIL 证书链不完整 E5, mydomain2+E5 mydomain3+E5+X1 失败FAIL unknow CA X1, mydomain2+E5 user1 失败FAIL 证书不匹配 X1, mydomain2+E5 mydomain2 失败FAIL 证书链不完整 X1, mydomain2+E5 mydomain2+E5 通过 X1, mydomain2+E5 mydomain3+E5 通过 X1, mydomain2+E5 mydomain4+E5 失败FAIL 过期 X1, mydomain2+E5 mydomain6+E6 通过 X1+E5, mydomain2+E5 mydomain3 通过 X1+E5, mydomain2+E5 mydomain6+E6 通过 X1+E5, mydomain2+E5 mydomain6 失败FAIL 证书链不完整 X1+E5+mydomain2, mydomain2+E5 user2 失败FAIL 证书无效 X1+E5, mydomain2+E5 user2+mydomain2+E5 失败FAIL 证书无效 X1+E6, mydomain2+E5 mydomain6 通过 CA_self+X1, mydomain2+E5 user1 通过 CA_self+X1, mydomain2+E5 mydomain6+E6 通过 - X1 是 letsencrypt 的 CA 根证书之一。是从操作系统预装的 CA证书目录中 copy出来的。
- 表中, radius的 server证书配置中 mydomain2+E5 表示使用 fullchain文件,即,包含对应的中间证书 E5。
- 表中, eapol-test的 client证书配置中 mydomain2+E5 表示使用 fullchain文件,即,包含对应的中间证书 E5。
- radius服务的配置中,server证书的配置与 ca_cert配置无关。server证书可以使用 letsencrypt等免费证书,而不影响使用自签名证书,做用户认证。
- radius服务的 ca_cert的文件中,可以包含多个 CA证书。这些 CA签发的 user证书都可以通过认证。
- radius服务的 ca_cert的文件中,可以包含对应 CA证书的二/三级证书。用户不必带上证书链,也可以通过认证。
- 从 letsencrypt 申请的域名证书 mydomain2 无CA属性,签发的用户证书无效。
- 作为wifi认证的radius服务,如果WiFi客户端有 iPad/iPhone, 每三个月更新server证书后,iPad/iPhone不能自动重连,必须手工点击"信任"证书。(2025-10测)
所以,server证书还是使用,有效期比较长的,自签名证书比较方便。 - 安卓客户端,如果选择"不验证CA",证书更新后,能自动连接。如果选择"使用系统证书验证",需要输入"域名",证书到期更新后,可以自动重连。
Newifi mini 的记录
- 编译好的 wpad-openssl_mipsel_24kc.ipk , wpad-openssl_x86_64.ipk 可以在这里找到现成的【github.备份的文件】。
- 刷完 op-19.07 ,root 总空间11.7MB,剩余 10.8MB。更换编译的 wpad-openssl 后,root空间剩余 8.6MB。
- 刷完 op-21.02 ,root 总空间10.6MB,剩余 10.0MB。更换编译的 wpad-openssl 后,root空间剩余 8.1MB。
- Newifi mini更换包之后,如果点不亮WiFi,试试把"高级设置"->"国家代码", 设为CN。
- 按照前文,在/etc/hostapd/中创建三个配置文件。hostapd.conf,hostapd.eap_user,hostapd.radius_clients。
- 找个Linux系统,创建一套证书。
- 测试
hostapd -dd /etc/hostapd.conf。如果OK,就 ctrl-c 退出。 /etc/rc.local中加一行/usr/sbin/hostapd -s -B -P /var/run/hostapd-radius.pid /etc/hostapd/hostapd.conf。就能开机启动了。
转载请注明来源。
来源: https://www.cnblogs.com/osnosn/p/10593297.html 来自osnosn的博客
--------- end ---------

浙公网安备 33010602011771号