Debian下搭建Ocserv(openconnect server),并启用证书验证
预计 12 分钟
安装编译依赖:
apt install \
build-essential \
autogen \
pkg-config \
protobuf-c-compiler \
gperf \
libtalloc-dev \
libreadline-dev \
libpam0g-dev \
libhttp-parser-dev \
libpcl1-dev \
libgnutls28-dev \
libev-dev \
libprotobuf-c-dev \
libhttp-parser-dev \
gnutls-bin \
libgeoip-dev \
libseccomp-dev
ocserv编译安装(目前最新版):
wget https://gitlab.com/openconnect/ocserv/-/archive/1.1.5/ocserv-1.1.5.tar.gz
tar Jxvf ocserv-1.1.5.tar.xz
cd ocserv-1.1.5
./configure --prefix=/usr --sysconfdir=/etc
make && make install
在预编译前如果需要ocserv支持更多的路由表需要编辑src/vpn.h(新版本以后已经不需要了):
#define DEFAULT_CONFIG_ENTRIES 200 // 默认96,iOS Anyconnect客户端最多支持到200条路由表
配置证书:
CA模板,创建ca.tmpl,按需填写,这里的cn和organization可以随便填。
cn = "Your CA name"
organization = "Your fancy name"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
CA密钥
certtool --generate-privkey --outfile ca-key.pem
CA证书
certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
同理,我们用CA签名,生成服务器证书。先创建server.tmpl模板。这里的cn项必须对应你最终提供服务的hostname或IP,否则AnyConnect客户端将无法正确导入证书。
cn = "Your hostname or IP"
organization = "Your fancy name"
expiration_days = 3650
signing_key
encryption_key
tls_www_server
Server密钥
certtool --generate-privkey --outfile server-key.pem
Server证书
certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
将CA,Server证书与密钥复制到以下文件夹
cp ca-cert.pem /etc/ssl/certs/my-ca-cert.pem
cp server-cert.pem /etc/ssl/certs/my-server-cert.pem
cp server-key.pem /etc/ssl/private/my-server-key.pem
生成证书认证需要的客户端证书
###创建user.tmpl
cn = "some random name"
unit = "some random unit"
expiration_days = 365
signing_key
tls_www_client
User密钥
certtool --generate-privkey --outfile user-key.pem
User证书
certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem
openssl pkcs12 -export -inkey user-key.pem -in user-cert.pem -certfile ca-cert.pem -out user.p12
将生成的客户端证书拷贝到可以在线下载的地址或者其他你可以导入到客户端的地方,比如我直接放到nginx的默认目录下以方便直接下载
cp user.p12 /var/www/html
ocserv配置文件
配置文件放置在/etc/ocserv/ocserv.conf
以下只保留重要内容
auth = "certificate"
tcp-port = 443 #端口可自定义,如果ISP对udp限制较高可尝试注释掉udp端口
udp-port = 443
# Keepalive in seconds
keepalive = 32400
# MTU discovery (DPD must be enabled)
try-mtu-discovery = true
cookie-timeout = 86400
mobile-dpd = 1800
server-cert = /etc/ssl/certs/my-server-cert.pem
server-key = /etc/ssl/private/my-server-key.pem
ca-cert = /etc/ssl/certs/my-ca-cert.pem
cert-user-oid = 2.5.4.3
dns = 8.8.8.8
网络
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 如果是ovz的服务器网卡应该为venet0
iptables -I INPUT -p tcp --dport 443 -j ACCEPT # 端口应与ocserv配置中配置的端口对应
iptables -I INPUT -p udp --dport 443 -j ACCEPT
现在直接使用
ocserv
就可以启用服务,需要查看日志的话可以使用
ocserv -f -d 1
在iOS端安装Anyconnect导入证书就可以了