
















上文详细介绍了 OpenWRT 路由器 OpenConnect VPN 的基础配置,本文将介绍通过部署自签 CA 根证书和客户端用户证书来实现更安全和方便的登录方式.
作为完美主义强迫症重度患者,经过参考网上的各种教程,以及朋友的指导和交流,实现了证书颁发,吊销,取消吊销.并在各种场景下完成了几种不同需求的登录方式测试.踩过各种坑后终于完美实现了整个使用环境的部署流程.特将详细步骤和重点整理出图文教程,供大家参考.
自签证书
编辑模版
客户端安装配置
本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.
自签证书参考网上各种教程很容易实现,同时还需要配置服务端模版才能生效启用.当多用户使用时还涉及到吊销证书和取消吊销的需求.本文将详细讲解整个完整的流程,并实践测试成功.
提前规划了证书目录和用户目录,方便证书后期的颁发,吊销和取消吊销等管理.推荐把以下所有命令复制到本地编辑器中,使用 Ctrl+F 或 CMD+F 查找并全部替换所有 stille 和 IOIOX 为 自己的ID 和 自己的组织 即可以快速生成属于你自己的整套证书.本文完全属于新手保姆级教程.
创建ssl目录,以存放ca 根证书相关文件.
mkdir -p /etc/ocserv/ssl创建user目录,以存放用户证书相关文件.
mkdir -p /etc/ocserv/ssl/user创建revoked目录,以存放吊销证书相关文件.
mkdir -p /etc/ocserv/ssl/revoked创建CA 根证书模版
cat >/etc/ocserv/ssl/ca.tmp<<EOF
cn = "IOIOX CA"
organization = "IOIOX"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
EOF生成CA 根证书私钥
openssl genrsa -out /etc/ocserv/ssl/ca.key.pem 2048根据CA 根证书私钥和CA 根证书模版生成CA 根证书.
certtool --generate-self-signed --hash SHA256 --load-privkey /etc/ocserv/ssl/ca.key.pem --template /etc/ocserv/ssl/ca.tmp --outfile /etc/ocserv/ssl/ca.cert.pem生成 Diffie-Hellman 密钥
certtool --generate-dh-params --outfile /etc/ocserv/ssl/dh.pem创建用户证书模版
cat >/etc/ocserv/ssl/user/stille.tmp<<EOF
cn = "stille"
unit = "IOIOX"
expiration_days = 3650
signing_key
tls_www_client
EOF生成用户证书私钥
openssl genrsa -out /etc/ocserv/ssl/user/stille.key.pem 2048根据用户证书私钥,CA 根证书,CA 根证书私钥,用户证书模版生成用户证书.
certtool --generate-certificate --hash SHA256 --load-privkey /etc/ocserv/ssl/user/stille.key.pem --load-ca-certificate /etc/ocserv/ssl/ca.cert.pem --load-ca-privkey /etc/ocserv/ssl/ca.key.pem --template /etc/ocserv/ssl/user/stille.tmp --outfile /etc/ocserv/ssl/user/stille.cert.pem证书链补全
cat /etc/ocserv/ssl/ca.cert.pem >>/etc/ocserv/ssl/user/stille.cert.pem生成.p12证书文件
由于 macOS 导入证书必须要有密码.务必修改末尾 pass: 后的密码.
openssl pkcs12 -export -inkey /etc/ocserv/ssl/user/stille.key.pem -in /etc/ocserv/ssl/user/stille.cert.pem -name "stille" -certfile /etc/ocserv/ssl/ca.cert.pem -caname "IOIOX CA" -out /etc/ocserv/ssl/user/stille.AnyConnect.p12 -passout pass:12345678至此CA 根证书和用户证书已成功生成.将stille.AnyConnect.p12证书拷贝至电脑以备导入使用.
CA 根证书所在路径为: /etc/ocserv/ssl/ca.cert.pem
.p12 用户证书所在路径为: /etc/ocserv/ssl/user/stille.AnyConnect.p12
当颁发多个用户证书来满足多用户使用时,证书分发给各用户后时无法远程吊销.此时如需禁止某用户登录 VPN ,则需生成吊销列表文件,让服务端读取列表文件,当该用户再次登录时,服务端会根据列表禁止登录.
以下三步为吊销证书创建基础文件,后续吊销或新增吊销,无需在重复此三步.
创建吊销模版
cat <<EOF >/etc/ocserv/ssl/revoked/crl.tmpl
crl_next_update = 365
crl_number = 1
EOF创建空的吊销文件
touch /etc/ocserv/ssl/revoked/revoked.pem根据CA 根证书私钥,CA 根证书,吊销模版生成空的吊销列表文件.
certtool --generate-crl --load-ca-privkey /etc/ocserv/ssl/ca.key.pem --load-ca-certificate /etc/ocserv/ssl/ca.cert.pem --template /etc/ocserv/ssl/revoked/crl.tmpl --outfile /etc/ocserv/ssl/revoked/crl.pem以上三步为吊销证书创建基础文件,后续吊销或新增吊销,仅需重复以下两步.
将需要吊销的用户证书写入吊销文件,例如将stille的证书吊销:
cat /etc/ocserv/ssl/user/stille.cert.pem >> /etc/ocserv/ssl/revoked/revoked.pem根据CA 根证书私钥,CA 根证书,吊销文件,吊销模版写入吊销列表文件.
certtool --generate-crl --load-ca-privkey /etc/ocserv/ssl/ca.key.pem --load-ca-certificate /etc/ocserv/ssl/ca.cert.pem --load-certificate /etc/ocserv/ssl/revoked/revoked.pem --template /etc/ocserv/ssl/revoked/crl.tmpl --outfile /etc/ocserv/ssl/revoked/crl.pem生成吊销列表文件后,需在 OpenConnect VPN 中编辑模版启用吊销证书列表,重启服务生效.详情可继续参考下文的模版编辑.
在多用户使用的场景使用到吊销证书,也可能会有恢复吊销的需求.同样可以根据以下命令实现.
需要注意的是,取消吊销的原理是把 revoked.pem 中 需要取消掉的证书 移除,并更新 crl.pem ,让服务端 不再禁止 该用户登录.
当 revoked.pem 中只有一个证书需要移除,移除后的 revoked.pem 文件为空文件,那么在更新 crl.pem 时,其命令是有所区别的.下文将以两种场景讲解.
编辑 revoked.pem 删除文件中已吊销的用户证书.删除后的revoked.pem为空文件,以下命令需 删除 --load-certificate /etc/ocserv/template/revoked.pem参数来更新crl.pem.否则会出现以下错误信息:
Generating a signed CRL...
Error loading certificates: No certificate was found.
vi /etc/ocserv/ssl/revoked/revoked.pem
# 删除取消吊销的用户证书,删除后的 revoked.pem 为空文件.
certtool --generate-crl --load-ca-privkey /etc/ocserv/ssl/ca.key.pem --load-ca-certificate /etc/ocserv/ssl/ca.cert.pem --template /etc/ocserv/ssl/revoked/crl.tmpl --outfile /etc/ocserv/ssl/revoked/crl.pem编辑 revoked.pem 找到并删除文件中已吊销的用户证书.由于revoked.pem还存在其他吊销证书的信息,以下命令则需要 继续使用 --load-certificate /etc/ocserv/template/revoked.pem参数来更新crl.pem.
vi /etc/ocserv/ssl/revoked/revoked.pem
# 删除取消吊销的用户证书
certtool --generate-crl --load-ca-privkey /etc/ocserv/ssl/ca.key.pem --load-ca-certificate /etc/ocserv/ssl/ca.cert.pem --load-certificate /etc/ocserv/ssl/revoked/revoked.pem --template /etc/ocserv/ssl/revoked/crl.tmpl --outfile /etc/ocserv/ssl/revoked/crl.pem以下为默认模版中比较重要的几个参数:
#auth = "certificate"
auth = "|AUTH|"
#ca-cert = /etc/ocserv/ca.pem
#crl = /etc/ocserv/crl.pem
#cert-user-oid = 0.9.2342.19200300.100.1.1#auth = "certificate"
证书登录参数,默认被注释禁用.如需证书登录,去掉注释符号#以启用.
auth = "|AUTH|"
账号密码登录参数,默认开启.网上大多教程是以Linux为安装平台.所以此处是auth = "plain[passwd=/etc/ocserv/ocpasswd]",而本文则是部署在OpenWRT上,此处"|AUTH|"大致是调用 Web 管理页面中的用户管理系统.
#ca-cert = /etc/ocserv/ca.pem
CA 根证书路径参数,默认被注释禁用.如需证书登录,去掉注释符号#以启用,并根据上文修改为正确的证书路径.
#crl = /etc/ocserv/crl.pem
吊销列表文件路径,默认被注释禁用.当吊销用户证书时,去掉注释符号#以启用,并根据上文修改为正确的文件路径.
#cert-user-oid = 0.9.2342.19200300.100.1.1
证书用户登录信息,默认被注释禁用.当启用证书登录时,去掉注释符号#以启用,并修改为cert-user-oid = 2.5.4.3即可在后台查看使用证书登录的用户信息.
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
此两个参数为当使用域名来连接 VPN 时,所需验证的域名证书的绝对路径.
保持默认模版参数为仅使用账号密码登录
#auth = "certificate"
auth = "|AUTH|"
#ca-cert = /etc/ocserv/ca.pem
#crl = /etc/ocserv/crl.pem
#cert-user-oid = 0.9.2342.19200300.100.1.1启用证书登录,禁用账号密码登录.
取消注释 auth = "certificate" 启用证书登录注释 auth = "|AUTH|" 禁用账号密码登录取消注释并修改 CA 根证书路径 ca-cert = /etc/ocserv/ssl/ca.cert.pem取消注释并修改值 cert-user-oid = 2.5.4.3
auth = "certificate"
#auth = "|AUTH|"
ca-cert = /etc/ocserv/ssl/ca.cert.pem
cert-user-oid = 2.5.4.3此方案需同时拥有证书和账号密码才可登录,且账号名需和证书中的用户名保持一致才能搭配使用登录.证书中的用户名取决于用户模版中的 cn 项的值. 已经过实践测试.
取消注释 auth = "certificate" 启用证书登录取消注释 auth = "|AUTH|" 启用账号密码登录取消注释并修改 CA 根证书路径 ca-cert = /etc/ocserv/ssl/ca.cert.pem取消注释并修改值 cert-user-oid = 2.5.4.3
auth = "certificate"
auth = "|AUTH|"
ca-cert = /etc/ocserv/ssl/ca.cert.pem
cert-user-oid = 2.5.4.3推荐此方案,可为自己配置证书以方便安全登录,临时为其他用户分配账号密码登录,方便删除.
取消注释 auth = "certificate" 启用证书登录取消注释 auth = "|AUTH|" 并修改为 enable-auth = "|AUTH|"取消注释并修改 CA 根证书路径 ca-cert = /etc/ocserv/ssl/ca.cert.pem取消注释并修改值 cert-user-oid = 2.5.4.3
auth = "certificate"
enable-auth = "|AUTH|"
ca-cert = /etc/ocserv/ssl/ca.cert.pem
cert-user-oid = 2.5.4.3注意如没有生成吊销列表文件,请不要启用此参数,否则会导致服务无法启动.
如已生成吊销列表文件,并吊销用户,但未取消注释以启用参数,将无法让服务端读取列表禁止被吊销的用户证书登录.
根据实际情况注释或取消注释并修改吊销文件路径 crl = /etc/ocserv/ssl/revoked/crl.pem
#crl = /etc/ocserv/crl.pem
# 如有吊销用户证书,需取消注释,并修改 crl.pem 路径.
crl = /etc/ocserv/ssl/revoked/crl.pem至此服务端的配置已全部完成
上篇文章推荐的 Cisco AnyConnect 下载地址:
https://pan.ioiox.com/shared/FOAgYXjTiVHqnMUN
双击打开AnyConnect.p12导入证书
下一步
输入生成.p12证书文件时创建的密码
自动选择证书存储
完成导入
确认安全警告

导入成功

常规安装 Windows 版客户端,打开软件,输入DDNS域名和端口连接即可无密码,无任何安全警告提示的登录 VPN.
连接成功
前方有坑,提前提醒.注意在首次登录时会提示 使用钥匙串中的私钥 一定要点 始终允许 ,否则后续每次登录都会提示.
双击打开AnyConnect.p12证书默认添加到登录
输入生成.p12证书文件时创建的密码
添加成功
双击AnyConnect.pkg安装
仅需安装VPN,取消勾选其他组件.

提示启用系统扩展
偏好设置 - 安全性与隐私 - 解锁允许
系统扩展成功启用,可忽略重新启动电脑.
继续安装组件
安装成功
打开AnyConnect输入DDNS域名和端口连接
输入 macOS 的登录密码,务必点击 始终允许.

连接成功

iOS 客户端的证书导入相对麻烦,需要使用 http/https 的 url 方式来导入.可以将证书临时存放到网站或者云存储上,待导入完成后在删除以确保安全.
AppStore 中搜索并下载名为Cisco AnyConnect的 APP
打开 APP - 主页 - 连接 - 添加 VPN 连接 - 输入DDNS域名和端口保存 - 允许添加 VPN 配置 - 输入 iPhone 密码

打开 APP - 诊断 - 证书 - 导入用户证书 - 输入AnyConnect.p12的url链接 - 输入生成.p12证书文件时创建的密码

点击启用连接成功
Android 和 Linux 由于没有相关设备和环境,请自行 Google 搜索相关教程.
至此已完成 OpenConnect VPN 的全部部署流程.如果本文对你有帮助,可以收藏到书签,后期博主在使用过程中发现更多的功能和技巧会再次更新到文章之中.同时感谢以下几篇文章让博主在实践中起到了重要参考作用:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。