标题写的是CentOS 7,其实RedHat系各发行版通用。
ocserv在CentOS 6上必须自行编译,且需要解决诸多依赖性问题,但在CentOS 7上配置相当容易。
申请服务器证书
生成CSR
cd ~
openssl req -new -newkey rsa:4096 -sha256 -nodes -out server.csr -keyout server.key
接下去的提示中,只有Common Name需要填写服务器域名,其他都可以留空。
不建议生成ECC证书,因为即使是正规CA签发,AnyConnect客户端也会提示不安全。
拿着生成的CSR文件,到沃通或StartCom或其他证书商签发。如果签名算法可选,务必选择SHA-2,不要用SHA-1。
沃通号称的快速签发只针对付费用户,对免费用户是工作时间人工审核签发。所以我把申请证书这一步放在最前面。
安装ocserv
yum install epel-release
yum install ocserv
配置ocserv
vim /etc/ocserv/ocserv.conf
修改如下:
#取消证书登录的注释,注释掉PAM登录
auth = "certificate"
#auth = "pam"
#客户端总上限以及单个账号客户端上限,私下用的话max-same-clients可以改大些
max-clients = 16
max-same-clients = 2
#监听端口
tcp-port = 1234
udp-port = 1234
#因为使用证书登录,所以必须注释掉这行
#listen-clear-file = /var/run/ocserv-conn.socket
#移动客户端掉线检测间隔,建议取消注释以节省手机等设备的电量
mobile-dpd = 1800
#这个改成true,否则可能会出现问题
try-mtu-discovery = true
#服务器证书的路径
server-cert = /etc/ocserv/pki/server/server.crt
server-key = /etc/ocserv/pki/server/server.key
#CA证书的路径
ca-cert = /etc/ocserv/pki/ca/ca.crt
#对客户端分配的内网地址。如果同时还运行其他VPN服务器,请确保IP段不会冲突
ipv4-network = 192.168.101.0
ipv4-netmask = 255.255.255.0
#DNS服务器
dns = 8.8.8.8
dns = 8.8.4.4
#dns = 其他较快较靠谱的DNS服务器
配置证书
创建目录
mkdir /etc/ocserv/pki && cd /etc/ocserv/pki
mkdir server ca clients template
配置Server证书
cd server
#将密钥移动过来
mv ~/server.key . && chmod 400 server.key
#将最开始签发好的证书复制过来
vim server.crt
配置CA证书
cd ../ca
certtool --generate-privkey --sec-param high --outfile ca.key
#自签证书信息随便写
cat << _EOF_ >../template/ca.tmpl
cn = "VPN CA"
organization = "Mid-south Sea"
serial = 1
expiration_days = 9999
ca
signing_key
cert_signing_key
crl_signing_key
_EOF_
#生成证书
certtool --generate-self-signed --load-privkey ca.key --template ../template/ca.tmpl --outfile ca.crt
chmod 400 ca.key
配置Client证书
cd ../template
vim client.tmpl
输入以下内容(可自己随意修改)
cn = user
o = "Organization"
email = user@example.com
dns_name = "www.example.com"
country = US
state = "New York"
serial = 1
expiration_days = 9999
signing_key
encryption_key #only if the generated key is an RSA one
tls_www_client
ipsec_ike_key
time_stamping_key
制作自动签发脚本
cd ..
vim make-client.sh
输入以下内容
#!/bin/sh
serial=`date +%s`
certtool --generate-privkey --outfile clients/$1.key
sed -i "1ccn = ${1}" template/client.tmpl
sed -i "3cemail = ${1}@example.com" template/client.tmpl
sed -i "7cserial = ${serial}" template/client.tmpl
certtool --generate-certificate --load-privkey clients/$1.key --load-ca-certificate ca/ca.crt --load-ca-privkey ca/ca.key --template template/client.tmpl --outfile clients/$1.crt
openssl pkcs12 -export -inkey clients/$1.key -in clients/$1.crt -name "$1 VPN Client Cert" -certfile ca/ca.crt -out clients/$1.p12
exit 0
设置权限
chmod 700 make-client.sh
然后就能用脚本很方便地生成客户端证书了:
./make-client.sh testuser
启动ocserv并设置开机启动
systemctl start ocserv
systemctl enable ocserv
配置FirewallD
创建一个ocserv服务
vim /etc/firewalld/services/ocserv.xml
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>ocserv</short>
<description>Cisco AnyConnect</description>
<port protocol="tcp" port="1234"/>
<port protocol="udp" port="1234"/>
</service>
启动firewalld
systemctl start firewalld
firewall-cmd --permanent --add-service=ocserv
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
配置客户端
如果之前用 make-client.sh
生成过证书,那么在 /etc/ocserv/pki/client
目录下可以找到相应的.p12文件。
将该文件传到手机/iPad等终端上。
安装AnyConnect或OpenConnect客户端,参见AnyConnect的使用方法。OpenConnect用法差不多。
提示
- 虽然上面提到自签证书的信息可以随意写,但由于证书本身的信息是明文传输的,所以不要写奇怪的字段,以免引起防火墙注意。
- Server证书不建议使用ECC证书,因为AnyConnect会提示不安全。CA和Client证书不能使用ECC证书,因为OpenConnect不支持。