返回

Openconnect证书认证

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

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

证书的使用

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

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模板 先创建一个目录存放模板文件,然后写入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
  • 生成CA秘钥及其证书 同样的先创建一个目录统一存放证书以及私钥,当然了还有工具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证书

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

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,但是它的证书有没有过到期时间,对其用户证书做吊销处理:

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

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 25, 2019 18:50 UTC