WPA2/WPA3协议支持基于EAP(可扩展身份验证协议)的认证。相较于使用PSK(预共享密钥)的认证而言,其安全性高出许多。EAP认证需要使用一个RADIUS服务端,而在Openwrt端较为理想的RADIUS服务端是freeradius。对于大多数内存达到128MB的路由器来说,直接在路由器本地运行freeradius是可行的(笔者使用的是Xiaomi AC2100路由器,21.02版本)。本文大致讲述在Openwrt上配置freeradius及其EAP-TLS认证协议的方法。
1.安装必要软件包Openwrt有两种安装软件的方式。其一是在编译Openwrt固件时包含该软件包(推荐)。由于Openwrt官方固件中默认包含的是不支持EAP认证的wpad-mini或者wpad-basic-wolfssl,此处需要将其更换为支持EAP认证的wpad(支持WPA2)或者wpad-openssl(支持WPA2和WPA3)。
构建编译环境的具体过程请参阅Openwrt Wiki:
[OpenWrt Wiki] Build system usage
此处略过,在构建好编译环境之后最后运行make defconfig,再make以检查是否存在缺陷。
一般情况下在使用全新的编译设定时,不要忘了加上luci。
$>make menuconfig
在Network目录内,选择FreeRADIUS (version 3)子目录,并包含freeradius3, freeradius3-common, freeradius3-default, freeradius3-utils即可。假如需要节省空间(真的吗?)可以不选择freeradius3-default而手动选择需要的模块。此时就需要选择always, attr-filter, detail, digest, eap及需要的eap方法, exec, expiration, logintime, preprocess, radutmp, realm。
返回上一级,在WirelessAPD子目录内,包含eapol-test-openssl, 移除wpad-mini和wpad-basic-wolfssl, 包含wpad或者wpad-openssl。
返回主界面进入Utilities目录,向下找到openssl-util并包含。
随后make download和make即可。
其二是使用Openwrt的软件包管理器opkg。不推荐使用本方法的原因是,由于Openwrt使用的是只读文件系统squashfs,从已编译好的固件中删除文件是理论不可行的,利用opkg卸载软件包并不能释放空间。
opkg update opkg remove wpad-mini wpad-basic-wolfssl opkg install freeradius3 freeradius3-default freeradius3-utils
或者只安装需要的模块
opkg install freeradius3 freeradius3-common freeradius3-democerts freeradius3-mod-always freeradius3-mod-attr-filter freeradius3-mod-chap freeradius3-mod-detail freeradius3-mod-digest freeradius3-mod-eap freeradius3-mod-eap-gtc freeradius3-mod-eap-leap freeradius3-mod-eap-md5 freeradius3-mod-eap-mschapv2 freeradius3-mod-eap-peap freeradius3-mod-eap-tls freeradius3-mod-eap-ttls freeradius3-mod-exec freeradius3-mod-expiration freeradius3-mod-expr freeradius3-mod-files freeradius3-mod-ldap freeradius3-mod-logintime freeradius3-mod-mschap freeradius3-mod-pap freeradius3-mod-passwd freeradius3-mod-preprocess freeradius3-mod-radutmp freeradius3-mod-realm freeradius3-mod-unix freeradius3-utils
再安装其他工具
opkg install openssl-util eapol-test-openssl2.配置EAP-TLS的PKI证书结构
选择一个目录存放相关证书。由于Openwrt一般情况下不作为多用户系统使用,PKI所在的目录的位置和权限并无严格要求,此处以存放在/etc/certs为例:
mkdir /etc/certs cd /etc/certs mkdir ca server clients #用于存放相应证书 touch index.txt echo 01>serial vim openssl.cnf
在openssl.cnf里写入如下内容
[ ca ]
default_ca = radius
[ radius ]
dir = .
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca/ca_cert.pem
serial = $dir/serial
private_key = $dir/ca/ca_key.pem
RANDFILE = $dir/.rand
default_bits = 4096
default_days = 365
default_crl_days = 365
default_md = sha512
unique_subject = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
其中default_ca处可根据自己需要修改。
default_days和default_crl_days指定证书和证书吊销列表的有效期,该时间最好不要超过365天。部分系统会默认不信任有效期过长的证书。
创建CA证书。
openssl req -x509 -nodes -newkey rsa:4096 -keyout ca/ca_key.pem -out ca/ca_cert.pem -new -sha512 -subj "/O=EAP-TLS/CN=Certificate Authority/"
此处的-subj后是自定义字段。O选项为组织名,所有证书应保持一致。CN选项为证书的通用名,对于CA证书可以自行指定,而对于用户证书则需要与实际用户名保持一致,CN不可重复。
导出x509格式的CA证书,对于Windows客户端而言,连接到受EAP-TLS保护的网络需要将对应的CA证书放入“受信任的根证书列表”存储区。
openssl x509 -outform der -in ca/ca_cert.pem -out ca/CA.crt
签发服务器证书。
openssl req -nodes -new -newkey rsa:4096 -keyout server/server_key.pem -out server/server_csr.pem -subj "/O=EAP-TLS/CN=Radius Server/" && openssl ca -in server/server_csr.pem -out server/server_cert.pem -config openssl.cnf && rm -rf server_csr.pem
签发客户端证书,并指定导出密码。用户名处换成实际用户名。
openssl req -nodes -new -newkey rsa:4096 -keyout clients/user_<用户名>_key.pem -out clients/user_<用户名>_csr.pem -subj "/O=EAP-TLS/CN=<用户名>/" && openssl ca -in clients/user_<用户名>_csr.pem -out clients/user_<用户名>_cert.pem -config openssl.cnf && rm -rf clients/user_<用户名>_csr.pem && openssl pkcs12 -export -out clients/<用户名>.p12 -inkey clients/user_<用户名>_key.pem -in clients/user_<用户名>_cert.pem -certfile ca_cert.pem
创建证书吊销列表。
openssl ca -gencrl -keyfile ca/ca_key.pem -cert ca/ca_cert.pem -out ca/crl.pem -config openssl.cnf && cat ca/ca_cert.pem ca/crl.pem > ca/ca_cert+crl.pem
生成DH文件
openssl dhparam -out dh 2048
到此,EAP-TLS所需的证书PKI就已经配置完毕了。
3.配置freeradius打开/etc/freeradius3/clients.conf,由于我们的RADIUS服务端和客户端位于同一设备上,所以只需修改secret即可。
secret = <此处自行指定RADIUS服务器密码>
编辑/etc/freeradius3/mods-enabled/eap.conf
#使用EAP-TLS认证
default_eap_type = tls
tls-config tls-common {
#此处如果在生成服务器证书时使用-nodes选项则留空,否则输入服务器私钥的密码
private_key_password =
#此处指定服务器私钥位置
private_key_file = /etc/certs/server/server_key.pem
#此处指定服务器证书位置
certificate_file = /etc/certs/server/server_cert.pem
#此处指定CA证书位置
ca_file = /etc/certs/ca/ca_cert+crl.pem
#此处指定dh文件位置
dh_file = /etc/certs/dh
#此处指定随机文件,对于Openwrt而言此处应该为random而不是urandom
random_file = /dev/random
#此处指定CA目录
ca_path = /etc/certs/ca
#选择加密方式
cipher_list = "HIGH"
#设置tls版本为1.2
tls_min_version = "1.2"
tls_max_version = "1.2"
verify {
#跳过额外检查
skip_if_ocsp_ok = yes
#注释此行以关闭检查
#client = "/usr/bin/openssl verify -CApath ${..ca_path} %{TLS-Client-Cert-Filename}"
}
}
其余内容则保持默认即可。
编辑/etc/freeradius3/sites-enabled/deault
authorize {
preprocess
# files
# -sql
}
authenticate {
# Auth-Type PAP {
# pap
# }
# Auth-Type CHAP {
# chap
# }
# Auth-Type MS-CHAP {
# mschap
# }
# mschap
# digest
}
其余内容则保持默认即可。
然后进行测试。准备一个测试文件test_tls.conf,写入以下内容
server={
eap=TLS
eapol_flags=0
key_mgmt=IEEE8021X
identity="<你的用户名>"
ca_cert="/etc/certs/ca/ca_cert.pem"
client_cert="/etc/certs/clients/user_<你的用户名>_cert.pem"
private_key="/etc/certs/clients/user_<你的用户名>_key.pem"
private_key_passwd="<私钥密码>"
}
新开一个shell窗口,执行
service radiusd stop radiusd -XX
观察输出结果显示Ready to process requests即为正常运行,否则freeradius会指出具体问题。
freeradius正常运行后,在原来的窗口中执行
eapol_test -c test_tls -a 127.0.0.1 -s <你的RADIUS服务器密码>
观看两个窗口的输出结果,如果eapol_test返回success,即为配置完成。
用Ctrl+C停止freeradius,然后执行
service freeradius start4.配置wpad
打开luci-Network-Wireless,选择需要配置的网络,在Wireless Security中选择WPA2-EAP或者WPA3-EAP/WPA2-EAP,填入RADIUS服务器地址127.0.0.1,端口1812,保存应用即可。
配置客户端 1.Windows客户端(以Windows10 1809为例)使用SCP工具下载ca证书/etc/certs/ca/CA.crt,以及客户端证书/etc/certs/clients/<你的用户名>.p12。
双击CA.crt打开证书,选择安装证书,安装到本地计算机
选择将所有的类型证书放入下列存储,然后选择受信任的根证书颁发机构
完成即可。
然后打开用户证书,使用同样的步骤,但是放入受信任的发布者。
在设置——网络和Internet中打开网络和共享中心,点击设置新的连接和网络,选择手动连接到无线网络。
输入网络的SSID,在安全类型中选择WPA2-企业,下一步更改连接设置。
在安全选项卡里选择网络身份验证方法为Microsoft:智能卡或其他证书,点击设置。
当连接时选择在此计算机上使用证书和简单证书选择,点击高级,勾选证书颁发者,从中勾选CA证书签发时的CN名,然后勾选扩展密钥用法,确定。
勾选通过验证证书来验证服务器的身份,从中勾选CA证书签发时的CN名,确定。
然后即可在任务栏中连接到对应的WLAN网络。
2.Android客户端(以Vivo手机Android 11为例)将客户端证书发送到手机,打开设置——安全——更多安全设置——从存储卡中安装证书。选择Wifi证书,依照提示安装。
连接对应WLAN网络,选择EAP-TLS,然后在CA证书和用户证书处选择安装好的证书,再输入用户名,即可连接。
3.iOS客户端通过邮件将客户端证书发送到手机,打开后在设置中安装。
连接对应网络,模式选择EAP-TLS,输入用户名,身份选择对应证书,即可连接。
参考:https://zhuanlan.zhihu.com/p/28927420



