更新ASUS路由器的OpenVPN证书

以前用PPTP就可以连回家里的ASUS路由器,而现在市面上无论手机还是PC出于安全考虑,基本仅支持IPSEC或者OpenVPN。考虑到灵活性且路由器的图形配置界面开启很容易,打算换用OpenVPN的方案。

按正常流程,配置结束可以导出client.ovpn配置文件,再通过手机版的OpenVPN导入这个配置文件就可以连接了。

实际尝试连接时,手机提示验证失败。路由器日志里看到XAUTH Authentication Failed的字样,再根据手机端的OpenVPN日志发现问题源是路由器OpenVPN证书仍然在使用SHA1

手机安装的新版OpenVPN觉得这样很不安全,拒绝与之通信。尽管可以在手机客户端加参数让一些违规操作以permissive放行,但实质的安全问题并没真的缓解。标准做法肯定是更新路由器里OpenVPN使用的证书,至少用SHA256作为签名的校验算法

值得庆幸的是,路由器的OpenVPN的高级配置栏可以找到[Content modification of Keys & Certification]这么个选项,里面允许更改[Certificate Authority],[Server Certificate],[Server Key],[Diffie Hellman parameters]。所以我们要做的就是自己生成强度足够的证书和密钥替换路由器默认使用的这套配置。

参考OpenVPN官方的配置文档,得知easy-rsa可以很容易生成对应的密钥文件,只不过官方文档年久失修,仍然在以停更良久的easy-rsa 2为例说明,目前换easy-rsa 3才是正解。

以Windows为例,首先从easy-rsa 3官方页面下载最新的release,解压后执行EasyRSA-Start.bat

在新的shell下面依次执行:

./easyrsa init-pki
./easyrsa build-ca
./easyrsa build-server-full server nopass
./easyrsa build-client-full client nopass
./easyrsa gen-dh

之后pki/ca.crt就是填写到[Certificate Authority]的内容;pki/issued/server.crt末尾的PEM填写到[Server Certificate]里,pki/private/server.key的内容写到[Server Key]栏目下面;最后,pki/dh.pem填写至[Diffie Hellman parameters]

保存并再次导出client.ovpn后需要注意,新的client.ovpn里客户端的证书和私钥都是留白状态,需要手动填写。也就是说要编辑client.ovpn,<cert>栏目里填写pki/issued/client.crt末尾的PEM,<key>栏目下填写pki/private/client.key的内容。