Android11在2020年12月发布的安全更新中进行了一个修复:PSA: Android 11 will no longer let you insecurely connect to enterprise WiFi networks
这项变更直接导致的是连接安全性为wpa2-enterprise
的WiFi时,去掉了不验证(Do Not Validate) CA证书
的选项:
802.1X
根据维基百科,802.1X是一种关于用户接入网络的认证标准,它工作在二层,通过EAP协议(Extensible Authentication Protocol)进行认证,为wpa-enterprise/wpa2-enterprise
提供了接入控制。BUPT的校园WiFi BUPT-mobile
使用的就是这样的接入方式:
EAP是一种可扩展的认证机制,通常使用的认证方法有EAP-TLS、EAP-TTLS、PEAP。前者是在服务端和客户端都会校验对方的证书。后两者则只需要服务器提供证书。
BUPT-mobile
可以选择TTLS
或者PEAP
方法,再结合学生的上网账号密码连接。这种认证方式使用PKI机制来确保验证过程的安全性(服务器发来一个证书,客户端用证书中包含的公钥与服务器建立通信),非常类似于浏览网页时建立TLS连接时的那样。
但是如何确保服务器发来的证书的真实性?这里有两个选择,一是向CA购买证书,另一种则是自建PKI系统,自己当CA,自己给自己发证书。
(像百邮这样"top secret"的,当然是选择后者啦23333)
因此,在ios设备上首次连接BUPT-mobile
后,会弹出一个这样的:
由于是采用自建的PKI系统,所以签发这个证书的CA证书是没有被预装在我们设备里面的,因此这里提示的是这个证书不可信。
Android上没有这样的提示,因此一直以来,我们在连接的时候都必须要选择 不验证 服务器发来的证书:
CA证书
在Android11之后,虽然没有了这个不验证
的选项,我们还是有办法连接校园WiFi的。
思路也很简单,既然不信任学校的CA签发的证书,那我们把CA的证书安装到手机里,信任了CA证书,那么它签发的证书也就能够被信任了。
用wireshark抓取证书
前面提到EAP是二层协议,我们在建立WiFi连接的时候进行抓取:
可以看到上面编号为7的包里面有AP发来的证书:
解开发现包含了两个证书,我们右键将其保存下来(后缀名为.cer):
这两个证书一个身份是BUPT Local Server Certificate
一个是BUPT Local Certificate Authority
。前者由后者所颁发,而后者是一个自签名的证书。从名字来看,相信后者应该就是BUPT自制的CA证书了。
安装证书
将CA证书(后者)传到手机上,在文件管理器中点击打开,会弹出一个证书安装程序:
选择凭据用途为WLAN,然后给它起个名点击确认安装。
在WiFi连接时:EAP方法选择TTLS
或者PEAP
,CA证书选择刚刚我们安装的那个证书,域名留空(如果必须要填域名的话,域名那里填BUPT Local Server Certificate
,即颁发的证书里的CN字段的值),身份和密码分别填写上网账号密码便可连接上了:
最后将证书文件放在这里:
文件的md5sum:
3784d3f46879644a0d1343208f381005 cer1.cer
4b60d9eaa8eaf05f784391d9e83a1f34 cer2.cer
最后,由于在设备上随意安装未知来源的CA证书是一件很危险的事情,使用上面的证书文件的同时,也意味着您已经了解并明白潜在的风险,本人不承担由此导致的任何责任。