配置 OpenVPN 服务器,我可以使用插件启用基于证书的身份验证或用户名/密码身份验证openvpn-plugin-auth-pam
,但不能同时启用两者。
我启用用户名/密码验证如下:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
client-cert-not-required
username-as-common-name
但是,一旦我添加以下行,配置证书认证的客户端就会停止工作,并在日志中显示以下消息:
TLS Error: Auth Username/Password was not provided by peer
TLS Error: TLS handshake failed
有没有什么方法可以不要求使用证书认证的客户端提供用户名/密码?
答案1
OpenVPN 不支持多种并发身份验证方法。正如评论中提到的,最好的解决方案是运行两个 OpenVPN 实例。在同一台机器上运行它会更复杂,但绝对可行。
不过,似乎有一些解决方法可能适合您的情况。
如果您知道哪些证书需要密码,哪些不需要,那么答案是肯定的。在服务器端使用“auth-user-pass-verify”脚本首先验证证书 DN(如果您也设置了--username-as-common-name,那么您将自动知道验证脚本中的证书通用名称)。如果您知道已输入密码的证书,则使用 pam 来验证用户名/密码。如果您知道证书不包含密码,则让脚本返回“0”以允许访问。
请注意,没有办法自动确定用户是否输入了证书密码 - 这在 openssl 握手之外,因此 OpenVPN 服务器不知道。
来源:https://openvpn.net/archive/openvpn-users/2007-12/msg00179.html
您还可以将 OpenVPN 生成的密钥对联合到本地 LDAP 服务器中,并使用上述脚本通过提供的证书对 LDAP 进行身份验证,或者在未提供证书的情况下使用提供的凭据。