Openconnect证书认证
in 日常技巧 with 0 comment

Openconnect证书认证

in 日常技巧 with 0 comment

上一篇文Openconnect密码认证已经写过,ocserv支持多种的认证方式,并记录了多种密码认证方式。

这一篇记录一下证书认证的实现过程,这种方式可以算最便捷而又安全的方式了。
imgbin-public-key-certificate.jpg

证书的使用

在开始前,先了解一下证书的签发过程。

Openconnect服务部署文中的配置文件当中,就有三处使用了证书配置

#服务器证书路径
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的模板

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

同样的先创建一个目录统一存放证书以及私钥,当然了还有工具gnutls-bin的安装

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

像CA模板一样,写入一个服务器模板

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
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多个用户,这里的用户名就用变量表示吧

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
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的名称、密码和确认密码。

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列出当前的用户连接状态
可以看到

iduservhostipvpn-ipdevicesincedtls-cipherstatus
5490user_testdefaultxx.xx.xx.xx192.168.1.64vpns05s(AES-256-GCM)connected
5487(none)unknownxx.xx.xx.xx 7s(no-dtls)pre-auth

吊销证书

同样当一个用户不再被允许连接VPN,但是它的证书有没有过到期时间,对其用户证书做吊销处理:

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

当然了,如果现在服务刚上,并没有需要吊销用户按照上面的配置是有问题的,应该这样设置空列表:
如果没有已撤销的证书,则应按如下方式生成空的撤销列表。

certtool --generate-crl --load-ca-privkey ca-key.pem \
 --load-ca-certificate ca-cert.pem \
 --template ../template/crl.tmpl --outfile crl.pem

配置文件更改

生成好了证书,还需要修改配置文件才能使用证书登录以及还需要提供CRL以允许服务器拒绝已被吊销的证书客户端,需要修改的项目有:

#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项目后,即可使用证书免密登录了。

--EOF--

Responses