上一篇文Openconnect密码认证已经写过,ocserv支持多种的认证方式,并记录了多种密码认证方式。
这一篇记录一下证书认证的实现过程,这种方式可以算最便捷而又安全的方式了。
证书的使用
在开始前,先了解一下证书的签发过程。
Openconnect服务部署文中的配置文件当中,就有三处使用了证书配置
1
2
3
4
5
6
|
#服务器证书路径
server-cert = /etc/ocserv/certs/server-cert-ca.pem
#服务器私钥路径
server-key = /etc/ocserv/certs/server-key.pem
#CA根证书路径
ca-cert = /etc/ocserv/certs/ca.pem
|
当时这里的证书是从编译后的源码目录当中拷贝过来直接使用的。
现在可以尝试自己签发一下证书。
自签名的证书会在客户端被提示不安全的,实际上是安全的,只是客户端本地没有预置受信任的CA证书。
可以尝试客户端安装CA证书,但这样会很麻烦,如果很强迫症,可以申请的SSL证书。
(申请受信任的SSL证书后,只需要生成CA证书以及用户的p12证书即可)
模板创建以及证书私钥生成
- CA模板
先创建一个目录存放模板文件,然后写入CA的模板
1
2
3
4
5
6
7
8
9
10
11
|
mkdir /etc/ocserv/template
cat <<EOF >/etc/ocserv/template/ca.tmpl
cn = "Lvmoo CA"
organization = "Lvmoo Group"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
EOF
|
- 生成CA秘钥及其证书
同样的先创建一个目录统一存放证书以及私钥,当然了还有工具
gnutls-bin
的安装
1
2
3
4
5
6
|
sudo apt-get install gnutls-bin -y
mkdir /etc/ocserv/ssl
cd /etc/ocserv/ssl
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem \
--template ../template/ca.tmpl --outfile ca-cert.pem
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
ip_add=$(curl -s https://api.lvmoo.com/ip/ | xargs echo -n)
cat <<EOF >/etc/ocserv/template/server.tmpl
cn = "Openconnect Server"
organization = "Lvmoo Group"
serial = 2
expiration_days = 3650
signing_key
encryption_key #only if the generated key is an RSA one
tls_www_server
dns_name = "www.example.com"
dns_name = "vpn1.example.com"
ip_address = "$ip_add"
EOF
|
1
2
3
4
5
|
cd /etc/ocserv/ssl
certtool --generate-privkey --outfile server-key.pem
certtool --generate-certificate --load-privkey server-key.pem \
--load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
--template ../template/server.tmpl --outfile server-cert.pem
|
- 用户模板
可能会生产N多个用户,这里的用户名就用变量表示吧
1
2
3
4
5
6
7
8
9
|
ocserv_user=user_kay
certtool --generate-privkey --outfile ${ocserv_user}-key.pem
cat <<EOF >/etc/ocserv/template/${ocserv_user}.tmpl
cn = "${ocserv_user}"
unit = "admins"
expiration_days = 365
signing_key
tls_www_client
EOF
|
1
2
3
4
|
cd /etc/ocserv/ssl
certtool --generate-certificate --load-privkey ${ocserv_user}-key.pem \
--load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
--template ../template/${ocserv_user}.tmpl --outfile ${ocserv_user}-cert.pem
|
p12证书是直接给到用户使用的证书文件,生成过程当中输入key的名称、密码和确认密码。
1
2
3
4
|
certtool --to-p12 --load-privkey ${ocserv_user}-key.pem \
--pkcs-cipher 3des-pkcs12 \
--load-certificate ${ocserv_user}-cert.pem \
--outfile ${ocserv_user}.p12 --outder
|
生成好的证书直接分发给到用户,在客户端进行导入即可,具体操作搜索一下吧(hhhhhhh 我只用过安卓端
用户状态查看
使用occtl show users
列出当前的用户连接状态
可以看到
id |
user |
vhost |
ip |
vpn-ip |
device |
since |
dtls-cipher |
status |
5490 |
user_test |
default |
xx.xx.xx.xx |
192.168.1.64 |
vpns0 |
5s |
(AES-256-GCM) |
connected |
5487 |
(none) |
unknown |
xx.xx.xx.xx |
|
|
7s |
(no-dtls) |
pre-auth |
吊销证书
同样当一个用户不再被允许连接VPN,但是它的证书有没有过到期时间,对其用户证书做吊销处理:
1
2
3
4
5
6
7
8
9
10
|
cd /etc/ocserv/ssl
cat <<EOF >/etc/ocserv/template/crl.tmpl
crl_next_update = 365
crl_number = 1
EOF
ocserv_user=user_test
cat ${ocserv_user}-cert.pem >>revoked.pem
certtool --generate-crl --load-ca-privkey ca-key.pem \
--load-ca-certificate ca-cert.pem --load-certificate revoked.pem \
--template ../template/crl.tmpl --outfile crl.pem
|
当然了,如果现在服务刚上,并没有需要吊销用户按照上面的配置是有问题的,应该这样设置空列表:
如果没有已撤销的证书,则应按如下方式生成空的撤销列表。
1
2
3
|
certtool --generate-crl --load-ca-privkey ca-key.pem \
--load-ca-certificate ca-cert.pem \
--template ../template/crl.tmpl --outfile crl.pem
|
配置文件更改
生成好了证书,还需要修改配置文件才能使用证书登录以及还需要提供CRL以允许服务器拒绝已被吊销的证书客户端,需要修改的项目有:
1
2
3
4
5
6
7
8
9
10
11
|
#auth = "pam[gid-min=1000]"
auth = "certificate"
#server-cert = /etc/ocserv/certs/server-cert-ca.pem
server-cert = /etc/ocserv/ssl/server-cert.pem
#server-key = /etc/ocserv/certs/server-key.pem
server-key = /etc/ocserv/ssl/server-key.pem
#ca-cert = /etc/ocserv/certs/ca.pem
ca-cert = /etc/ocserv/ssl/ca-cert.pem
#cert-user-oid = 0.9.2342.19200300.100.1.1
cert-user-oid = 2.5.4.3
crl = /etc/ocserv/ssl/crl.pem
|
其中带#为注释掉的原配置项。
此时重启ocserv项目后,即可使用证书免密登录了。