在OpenConnect VPN服务器(ocserv)中设置证书身份验证
- 技术文档
- 2022.03.23
- 浏览:2013
文章目录[隐藏]
本教程将向您展示如何在Debian/Ubuntu/CentOS/RHEL上的OpenConnect VPN服务器(ocserv)中设置证书身份验证。OpenConnect(ocserv)是Cisco AnyConnect VPN协议的开源实现。
在前一篇文章中,我解释了使用Let's Encrypt TLS服务器证书设置OpenConnect VPN服务器的步骤。让我们加密不颁发客户端证书,所以在那篇文章中,我们使用了密码身份验证。每次输入用户名和密码都会很麻烦,尤其是当客户端软件(如iOS上的Cisco AnyConnect应用程序)不提供记住密码的选项时。许多OpenConnect客户端软件可以导入用户证书,这将使用户不必输入用户名和密码。证书认证也比密码认证更安全。
要求
为了学习本教程,假设您已经使用Let's Encrypt TLS server证书设置了OpenConnect VPN服务器。如果没有,请遵循以下教程之一。
- 在Ubuntu20.04上用Let's Encrypt设置OpenConnect VPN服务器(ocserv)
- 使用Let's Encrypt在Debian 11 Bullseye上设置OpenConnect VPN服务器(ocserv)
- 使用Let's Encrypt在CentOS 8/RHEL 8上设置OpenConnect VPN服务器(ocserv)
我们将建立自己的CA(证书颁发机构)来签署客户证书。ocserv守护程序应该继续使用Let's Encrypt颁发的TLS服务器证书,这样客户端软件就不会显示安全警告。
设置自己的CA(证书颁发机构)
我们希望使用证书身份验证,但我们加密不会颁发客户端证书,因此我们需要创建自己的CA。您可以使用openssl来完成这项工作,但ocserv建议使用GnuTLS,因此我将向您展示如何使用GnuTLS。
在Debian/Ubuntu服务器上安装gnutls bin包。
sudo apt安装gnutls bin
在CentOS/RHEL上安装gnutls utils包。
sudo dnf安装gnutls utils
在/etc/ocserv/中创建一个子目录以保存私钥和证书。
sudo mkdir/etc/ocserv/ssl/
更改工作目录。
cd/etc/ocserv/ssl/
使用certtool命令为CA生成私钥,该命令由gnutls bin或gnutls utils包提供。默认情况下,它生成3072位RSA密钥,这就足够了。
sudo certtool——生成私钥——输出文件ca私钥。佩姆
在生成CA证书之前,我们先创建CA证书模板文件。模板文件格式可在certtool手册(man certtool)中找到。
sudo nano ca-cert.cfg
将以下行添加到文件中。用适当的值替换占位符。
#X.509证书选项#科目的组织。organization=“vpn.example.com”#证书所有者的通用名称。cn=“示例CA”#证书的序列号。serial=001#从今天算起,该证书将在多少天内过期。如果没有过期日期,请使用-1。过期天数=-1#这是否是CA证书#此证书是否将用于签署数据签名#此密钥是否将用于签署其他证书。cert_signing_key#此密钥是否将用于签署CRL。crl_签名_密钥
保存并关闭文件。现在使用模板文件中的配置生成CA证书。
sudo certtool--生成自签名--加载privkey ca privkey。pem--模板ca-cert.cfg--输出文件ca-cert.pem
现在我们有了一个CA证书文件(CA-cert.pem)。
生成客户端证书
现在运行以下命令生成客户端私钥。
sudo certtool——生成私钥——输出文件客户端私钥。佩姆
创建客户端证书模板文件。
sudo nano client-cert.cfg
将以下行添加到文件中。uid必须是/etc/ocserv/ocpasswd文件中的用户名。
#X.509证书选项#科目的组织。organization=“vpn.example.com”#证书所有者的通用名称。cn=“John Doe”#证书所有者的用户id。uid=“username”#从今天算起,此证书将在多少天内过期。如果没有过期日期,请使用-1。到期日=3650#此证书是否将用于TLS服务器TLS#www#客户端#此证书是否将用于签署数据签名#密钥#此证书是否将用于加密数据(需要#在TLS RSA密码套件中)。请注意,最好使用不同的#密钥进行加密和签名。加密密钥
保存并关闭文件。然后运行以下命令生成客户端证书,该证书将由CA私钥签名。
sudo certtool--生成证书--加载私钥客户端私钥。pem——加载ca证书ca-cert.pem——加载ca私钥ca私钥。pem--模板client-cert.cfg--输出文件client-cert.pem
将客户机私钥和证书组合到一个受PIN保护的PKCS#12文件中。
sudo certtool——to-p12——加载私钥客户端私钥。pem--加载证书客户端-cert.pem--pkcs密码aes-256--输出文件客户端。p12——户外
现在,我们将客户机私钥和证书合并到一个文件客户机中。第12页。
请注意,iOS上的Ciso AnyConnect应用程序不支持AES-256密码。它将拒绝导入客户端证书。如果用户使用的是iOS设备,则可以选择3des-PKCS12密码。
sudo certtool——to-p12——加载私钥客户端私钥。pem--加载证书客户端-cert.pem--pkcs密码3des-pkcs12--输出文件ios客户端。p12——户外
客户端私钥和证书合并到一个文件ios客户端。第12页。
证书签名请求
只有当有多个VPN用户,并且用户希望使用自己的私钥时,才需要此步骤。
为了对最终用户的私钥保密,用户可以使用自己的私钥生成证书签名请求(CSR),然后向管理员发送证书请求,管理员随后向用户颁发客户端证书。首先,他们必须使用上述命令生成私钥和客户端证书模板。然后使用以下命令生成CSR。请求。pem文件由用户的私钥签名。
certtool——生成请求——加载私钥客户端私钥。pem——模板client-cert.cfg——输出文件请求。佩姆
接下来,用户发送请求。将pem和client-cert.cfg文件发送给管理员,管理员运行以下命令生成客户端证书。
sudo certtool--生成证书--加载ca证书ca-cert.pem--加载ca私钥ca私钥。pem——加载请求。pem--模板client-cert.cfg--输出文件client-cert.pem
之后,管理员将client-cert.pem证书文件发送给用户。
在ocserv守护程序中启用证书身份验证
编辑ocserv配置文件。
sudo nano/etc/ocserv/ocserv。形态
在上一个教程中,我们添加了以下行以启用密码身份验证。
auth=“plain[passwd=/etc/ocserv/ocpasswd]”
要启用证书身份验证,请取消注释以下行。
auth=“证书”
如果以上两行都未注释,则意味着用户必须同时通过密码身份验证和证书身份验证。因此,如果证书认证足以证明身份,那么请注释掉第一行。
如果允许用户选择证书身份验证或密码身份验证,则应改为使用以下行。
启用auth=“plain[passwd=/etc/ocserv/ocpasswd]”auth=“certificate”
现在找到ca证书参数。在Debian/Ubuntu上,设置为
ca证书=/etc/ssl/certs/ssl证书蛇油。佩姆
在CentOS 8/RHEL 8上,设置为
ca cert=/etc/ocserv/ca.pem
我们需要使用我们自己的CA证书来验证客户端证书,所以将此行更改为
ca-cert=/etc/ocserv/ssl/ca-cert.pem
接下来,找到下面这行。
证书用户oid=0.9.2342.19200300.100.1.1
你不需要改变它。我只想告诉你,0.9.2342.19200300.100.1.1代表客户证书中的UID。上面的一行告诉ocserv守护程序从客户端证书的UID字段中查找用户名。如果客户端证书已通过CA证书成功验证,并且ocserv守护程序可以在/etc/ocserv/ocpasswd文件中找到匹配的用户名,则客户端可以登录。
保存并关闭文件。然后重启ocserv。
sudo systemctl重启ocserv
在Debian/Ubuntu/CentOS/RHEL桌面上使用证书认证
使用scp命令下载客户端。p12文件到Debian/Ubuntu/CentOS/RHEL桌面。
scp[email ;protected]:/etc/ocserv/ssl/client。p12~
然后安装openconnect客户端软件。
Debian/Ubuntu:
sudo apt安装openconnect
CentOS/RHEL:
sudo dnf安装epel释放sudo dnf安装openconnect
要使用证书身份验证,请运行
sudo openconnect-b vpn。实例com-c客户端。p12
您将被要求使用本教程中较早设置的密码短语解锁客户端私钥。
如果密码输入正确,您现在应该连接到VPN服务器。
在Windows和MacOS桌面上使用证书身份验证
从OpenConnect GUI Github页面下载Windows或MacOS的OpenConnect GUI客户端。然后创建一个新的VPN连接配置文件,并将PKCS#12文件导入用户证书字段。点击保存按钮。您需要输入PIN才能解锁私钥。导入后,您不必再输入用户名和密码。
在iOS设备上使用证书身份验证
iOS用户可以使用Cisco AnyConnect应用程序。要在AnyConnect应用程序中导入客户端证书,您可以先将PKCS#12文件发送到附件中的电子邮件地址。然后在iOS上打开邮件应用程序。点击附件几秒钟,并与AnyConnect共享。然后输入PIN以导入文件。
导入后,在AnyConnect中编辑VPN连接。转到高级->;证书,然后选择客户端证书。保存你的设置。
现在你不必再在iOS设备上输入用户名和密码了。Cisco AnyConnect应用程序不记得用户名和密码,因此在密码验证模式下,当手机不使用时,VPN连接将断开。在证书认证模式下,如果连接断开,应用程序将自动重新连接到VPN服务器。
iOS上AnyConnect客户端的问题
iOS上最新版本的AnyConnect客户端在TLS 1.3协议中使用证书身份验证时出现问题。如果在ocserv日志(sudo journalctl-eu ocserv)中看到以下错误,那么您也会遇到同样的问题。
GnuTLS错误(在worker vpn.c:795):已收到TLS致命警报。
您需要在AnyConnect iOS客户端中使用密码身份验证,或者在ocserv配置文件中禁用TLS 1.3。禁用TLS1。3.在/etc/ocserv/ocserv中查找tls priorities参数。配置文件,并添加:-VERS-TLS1。3最后禁用TLS 1.3。
tls priorities=“正常:%SERVERu优先级:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3”
保存并关闭文件。然后重启ocserv。
sudo systemctl重启ocserv
注意:如果您在ocserv日志中看到SSL 3.3短语,请不要惊慌。SSL 3.3是TLS 1.2的另一个词。您正在使用安全的TLS连接。
收尾
我希望本教程能帮助您在OpenConnect VPN服务器中设置证书身份验证。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?