CentOS 7 安装 ocserv (OpenConnect Server) 并实现证书登录

标题写的是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用法差不多。

提示

  1. 虽然上面提到自签证书的信息可以随意写,但由于证书本身的信息是明文传输的,所以不要写奇怪的字段,以免引起防火墙注意。
  2. Server证书不建议使用ECC证书,因为AnyConnect会提示不安全。CA和Client证书不能使用ECC证书,因为OpenConnect不支持。

参考资料

  1. OpenConnect Server Manual
  2. 自动签发脚本

发表评论

您的电子邮箱地址不会被公开。