前言
上文详细介绍了 OpenWRT 路由器 OpenConnect VPN 的基础配置,本文将介绍通过部署自签 CA 根证书和客户端用户证书
来实现更安全和方便的登录方式.
本文大纲
自签证书
- 自签 CA 根证书
- 自签用户证书
- 吊销用户证书
- 取消吊销用户证书
编辑模版
- 参数介绍
- 多种登录方式
客户端安装配置
- 客户端下载
- Windows 客户端安装流程
- macOS 客户端安装流程
- iOS 客户端安装流程
自签证书
自签证书参考网上各种教程很容易实现,同时还需要配置服务端模版
才能生效启用.当多用户使用时还涉及到吊销证书
和取消吊销
的需求.本文将详细讲解整个完整的流程,并实践测试成功
.
重点推荐
创建证书目录
创建ssl
目录,以存放ca 根证书
相关文件.
mkdir -p /etc/ocserv/ssl
创建user
目录,以存放用户证书
相关文件.
mkdir -p /etc/ocserv/ssl/user
创建revoked
目录,以存放吊销证书
相关文件.
mkdir -p /etc/ocserv/ssl/revoked
自签 CA 根证书
创建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
证书文件
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
取消吊销
在多用户使用的场景使用到吊销证书,也可能会有恢复吊销的需求.同样可以根据以下命令实现.
当 revoked.pem 中只有一个证书需要移除,移除后的 revoked.pem 文件为空文件,那么在更新 crl.pem 时,其命令是有所区别的.下文将以两种场景讲解.
当前仅一个已吊销证书,将其恢复使用.
编辑 revoked.pem 删除
文件中已吊销的用户证书
.删除后的revoked.pem
为空文件,以下命令需 删除 --load-certificate /etc/ocserv/template/revoked.pem
参数来更新crl.pem
.否则会出现以下错误信息:
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
证书及账号密码双重验证
取消注释
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
客户端安装配置
客户端下载
https://pan.ioiox.com/shared/FOAgYXjTiVHqnMUN
Windows 客户端安装配置流程
导入用户证书
双击打开AnyConnect.p12
导入证书
下一步
输入生成.p12
证书文件时创建的密码
自动选择证书存储
完成导入
确认安全警告
导入成功
安装配置 Windows 客户端
常规安装 Windows 版客户端,打开软件,输入DDNS域名
和端口
连接即可无密码,无任何安全警告提示的登录 VPN.
连接成功
macOS 客户端安装配置流程
导入用户证书
双击打开AnyConnect.p12
证书默认添加到登录
输入生成.p12
证书文件时创建的密码
添加成功
安装配置 macOS 客户端
双击AnyConnect.pkg
安装
仅需安装VPN
,取消勾选
其他组件.
提示启用系统扩展
偏好设置 - 安全性与隐私 - 解锁允许
系统扩展成功启用,可忽略重新启动电脑
.
继续安装组件
安装成功
打开AnyConnect
输入DDNS域名
和端口
连接
连接成功
iOS 客户端安装配置流程
下载 iOS 客户端
AppStore 中搜索并下载名为Cisco AnyConnect
的 APP
配置 iOS 客户端
打开 APP - 主页 - 连接 - 添加 VPN 连接 - 输入DDNS域名
和端口
保存 - 允许添加 VPN 配置 - 输入 iPhone 密码
iOS 客户端导入证书
打开 APP - 诊断 - 证书 - 导入用户证书 - 输入AnyConnect.p12
的url
链接 - 输入生成.p12
证书文件时创建的密码
连接成功
点击启用连接成功
其他客户端
Android 和 Linux 由于没有相关设备和环境,请自行 Google 搜索相关教程.
结语
至此已完成 OpenConnect VPN 的全部部署流程.如果本文对你有帮助,可以收藏到书签,后期博主在使用过程中发现更多的功能和技巧会再次更新到文章之中.同时感谢以下几篇文章让博主在实践中起到了重要参考作用:
19 条评论
请问一下,在创建用户证书模板时,提示nonexistent directory是什么情况,怎么处理呢
我太蠢了,手打目录打错了,换putty粘贴命令就好了
[...]OpenWRT 路由器 OpenConnect VPN 详细图文教程 – 基础配置篇[...]
[...]扩展推荐阅读:OpenWRT 路由器 OpenConnect VPN 详细图文教程 – 基础配置篇OpenWRT 路由器 OpenConnect VPN 详细图文教程 – 基础配置篇[...]
[...]OpenWRT 路由器 OpenConnect VPN 详细图文教程 – 证书配置篇[...]
遇上很奇怪的问题,使用密码登陆能正常使用。配置证书后,使用证书登陆,就提示“由于出现服务器通信错误,所尝试的连接操作已失败。请重新尝试连接”
已经确定问题了,安卓anyconnect版本问题,最新版本谷歌市场的anyconnect安卓客户端,会出现这个问题,在普通的4.8.03538版本正常连接成功分享一个下载连接,https://cloud.189.cn/t/AbimYrN3Q7ze
感谢,确实是版本问题,可能新版本不信任自签证书吧。测试安卓和win下的4.9版本都会出现这个问题,换旧版本就没事了
好的。我客户端确实是从菜市场下载的最新版,我试试你发的这个客户端。
模版配置都正确么?
按道理能密码登录表示网络基本没问题了.
尝试在模版和证书这块找下原因?
就改了下面这四个地方,我在想是不是证书生成有问题?
auth = "certificate"
enable-auth = "|AUTH|"
ca-cert = /etc/ocserv/ssl/ca.cert.pem
cert-user-oid = 2.5.4.3
同时共存的方式下.可能会有以下冲突.尝试排查下.
如果为你的ID,例如 vay 创建了密码,然后在生成用户证书时也是以 vay 命名,是否可能有冲突.
尝试用不同ID试试?
是在不行,重新配置下证书吧.或者重启下 openconnect 服务,是否是生成证书或者修改配置没生效
好的,谢谢。我在尝试下
明天会发一篇新的文章,也是基于 openconnect 协议的开源软件部署教程.你可以关注下.
唯一我觉得比这个差的是暂时不支持证书登录.
好的,等你的新文章。不过不支持证书登录,强密码输密码太费劲了
我也遇到这个问题,情况是安卓下,miui12.0.5安卓版本10 ,在win10下正常证书登录,在安卓下就遇到和上面一模一样的错误“由于出现服务器通信错误,尝试的链接失败,用密码登录就很正常