在OpenConnect VPN服务器(ocserv)中设置证书身份验证

  • 技术文档
  • 2022.03.23
  • 浏览:2533

本教程将向您展示如何在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——户外

ocserv certificate authentication

现在,我们将客户机私钥和证书合并到一个文件客户机中。第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

您将被要求使用本教程中较早设置的密码短语解锁客户端私钥。

ocserv client certificate ubuntu

如果密码输入正确,您现在应该连接到VPN服务器。

在Windows和MacOS桌面上使用证书身份验证

从OpenConnect GUI Github页面下载Windows或MacOS的OpenConnect GUI客户端。然后创建一个新的VPN连接配置文件,并将PKCS#12文件导入用户证书字段。点击保存按钮。您需要输入PIN才能解锁私钥。导入后,您不必再输入用户名和密码。

openconnect GUI client certificate authentication

在iOS设备上使用证书身份验证

iOS用户可以使用Cisco AnyConnect应用程序。要在AnyConnect应用程序中导入客户端证书,您可以先将PKCS#12文件发送到附件中的电子邮件地址。然后在iOS上打开邮件应用程序。点击附件几秒钟,并与AnyConnect共享。然后输入PIN以导入文件。

ios anyconenct import client certificate

导入后,在AnyConnect中编辑VPN连接。转到高级->;证书,然后选择客户端证书。保存你的设置。

ios anyconnect client certificate authentication

现在你不必再在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服务器中设置证书身份验证。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?