本文某个不可描述词由于不可描述原因用WePN代替。
转载自:http://vinqon.coding.me/2017/02/23/strongswan_ikev2/

之前根据CentOS/Ubuntu一键安装IPSEC/IKEV2 WePN服务器(https://quericy.me/blog/699/) 搭建一个WePN服务器,这套方案里面提供了两种方式连接IPSec(即IKEv1)和IKEv2,前者可以通过帐号、密码以及密钥PSK 即可连接,比较方便。后者需要证书,比较麻烦。所以我使用了IPsec作为iOS客户端产品的最终方案。

最近突然想起这件事情,加上之前调研的实践让我记得IKEv2方案其实更加安全并且稳定。『稳定』的表现是,可以在切换网络依然保持WePN不断开,这是一种不错的体验。所以,打算把目前方案迁移为IKEv2,所以做了一下调研。

首先是『无证书』问题。对于IKEv2,之前有了解到是可以实现无证书连接,这点很重要,不然得引导用户安装证书才能连接,体验会很差。今天用了一些时间调研,大概有下面这些方案:

服务器使用自签发证书,客户端需要提前安装配套证书
服务器使用CA证书,则客户端则可免证书
服务器使用PSK密钥验证,客户端添加带PSK的WePN配置描述文件
服务器使用PSK密钥验证,客户端通过程序添加带PSK的WePN配置
1和2这两个方案都不是真正的免证书,它们出现在很多文章里,但这里的『无证书』并不是指完全不用证书,而是是指客户端连接之前不需要配置证书,但服务器端依然需要。根据用 strongSwan 搭建免证书的 IKEv2 WePN 一文描述,确实可以通过PSK密钥代替证书实现服务器和客户端都无证书的方案(方案3),但是这个方案在设置GUI中无法配置,只能通过添加描述文件来配置,挺扯蛋的。但是,我发现这个办法在通过程序配置也是可以的,也就是第4个方案,网上没有找到任何人提出这个方案,我后面会详细介绍。

因为只有2和4方案是无需用户做额外配置,所以下面只讨论这两种方案。另外,需要说明的是,这些方案只有iOS客户端验证成功,其他客户端理论可行,欢迎反馈。

方案一/服务器使用CA证书
首先,弄个CA证书,CA证书很多免费的,这边查到了比较多人使用的是Let’s Encrypt SSL,但是有一个缺点就是需要定时续期。以下是配置步骤:

1.安装Let’s Encrypt SSL的客户端
git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto --help

1)、如果提示Git命令无效的话,需要安装一下git,直接执行命令 yum install git-all 完成安装
2)、如果是RedHat/CentOs6系统的话,需要提前安装EPEL(Extra Packages for Enterprise Linux),执行命令 yum install epel-release

2.执行客户端申请证书,按照提示输入邮箱和域名就完成了

./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview

3.证书三个月后就过期,可以设定一个定时器,执行以下续期脚本

sudo ~/.local/share/letsencrypt/bin/letsencrypt renew
4.把证书全部复制到strongswan一键安装脚本目录
cp chain.pem /root/ca.cert.pem # 包括根证书的链证书 cp cert.pem /root/server.cert.pem # 服务器证书 cp privkey.pem /root/server.pem # 服务器私钥
5.然后就是安装Strongswan了,注意两点:
1) 证书选择自己导入证书,否则脚本会自己生成自签发证书;

2) 安装完之后,需要去/usr/local/etc/ipsec.conf修改leftid,leftid需要和证书的域名保持一致,域名可以不指向本机IP,就是说一个有效证书可以用在多个Strongswan WePN的服务器上;

6. 启动Strongswan之后,就用手机连接了。下面是系统WePN设置页面的配置Demo;

用户名和密码修改路径:/usr/local/etc/ipsec.secrets

重新加载用户名密码文件:ipsec rereadsecrets