osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

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证书认证,证书自行生成,可以吊销单个证书而阻止再次连接。

参考

本文参考了几位大神的文章:

其他链接

安装配置-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

创建证书

设置 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
      

用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+key
    eapol-test
    不设置ca_cert
    CA_self, server1 用户名+密码 认证通过
    E5, mydomain2+E5 用户名+密码 通过
    X1, mydomain2+E5 用户名+密码 通过
    CA_self, mydomain2+E5 用户名+密码 通过
    CA_self, mydomain4+E5 用户名+密码 通过, 显示服务器证书过期
  • tls 测试 (2025-08测)
    radius
    ca_cert, server+key
    eapol-test
    不设置ca_cert
    CA_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 ---------

posted on 2019-03-27 20:31  osnosn  阅读(4179)  评论(0)    收藏  举报