VPN使用ECDSA证书

Let’s Encrypt去年2月开始支持签发基于ECDSA私钥的证书申请,我的http服务器上是早就使用了ecdsa证书,但是VPN的服务器上一直没有使用,主要是担心软件不支持。最近debian testing的OpenVPN升到了2.4,测试了下,已经支持之前不能使用的ecdhe的密钥交换方式(ecdhe-rsa),就想着试验下是不是同时也添加了ecdsa的支持。

VPN的三个软件,ocserv、strongswan的ikev2和openvpn都是需要证书才能正常工作。ocserv和strongswan很早就支持ecdsa,但是openvpn在debian的testing里面最近才升级到2.4版本,包含了ecdhe和ecdsa的支持。

首先申请基于ecdsa的证书,生成私钥:

openssl ecparam -name secp384r1 -genkey -noout > test.key

这里有个小tricky point,openssl如果输出私钥用-out参数的话会在私钥里面加上ec parameter段,生成的私钥strongswan会无法读取(提示building CRED_PRIVATE_KEY - ECDSA failed, tried n builders),用noout打印到屏幕再导出就没这个问题。然后用le的客户端签发证书。

openvpn配置里面加上tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384限制使用的密钥种类和交换方式。

测试结果,用AnyConnect(手机端)连接服务器没有问题,OpenVPN也工作正常,但是ikev2出了点问题。Android上的ikev2客户端连接没有问题,Win10的也工作正常,但是Win7的客户端链接会卡在验证用户名密码这步,同时一堆service崩溃。看系统日志说svchost的ikeext模块崩溃,然后连带一堆基于svchost的服务全部crash。估计Win7的ikev2客户端不支持ecdsa的服务器证书。