内容目录

OpenVPN基于用户密码认证

为何需要用户密码

我们目前使用密钥进行加密传输,可以说已经很安全了,为什么还需要用户名密码呢

  1. 首先管理这些密钥和证书比较麻烦,如果用户比较多,单独为每个用户都创建一套密钥比较麻烦
  2. 其次多人使用同一密钥又不具有唯一性,比如说有用户不在需要VPN的时候,我们就需要吊销证书,如果多人使用一个密钥的情况下,吊销证书会造成其他用户也无法正常登录

所有就需要密钥加用户名密码,这样就可以实现多个用户使用同一个证书,使用不同的用户名和密码;当有新用户加入时,只需要添加一个用户名和密码即可,如果不需要使用,则删除用户名和密码即可

OpenVPN服务端配置

修改服务端配置

# 添加以下三号代码,使其服务端支持密码认证方式
vim /etc/openvpn/server.conf
script-security 3   #允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/check.sh via-env  #自定义脚本路径
username-as-common-name  #用户密码登录方式验证
#表示只使用用户名密码方式验证,注释掉,则代表用户名密码、证书多重验证登录
#client-cert-not-required

创建自定义脚本

cat check.sh
#!/bin/bash
# 用户列表
PASSFILE="/etc/openvpn/openvpnfile"
# 用户登录情况的日志
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
if [ ! -r "${PASSFILE}" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
    exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}'    ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
    echo "${TIME_STAMP}: User does not exist: username=\"${username}\",password=\"${password}\"." >> ${LOG_FILE}
    exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
    echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
    exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1

为脚本增加执行权限
chmod +x /etc/openvpn/check.sh

创建用户密码文件

cat openvpnfile
xxx xxx  # 前面是用户名,后面是密码

重启openvpn服务

systemctl restart openvpn@server

OpenVPN客户端配置

修改windows客户端配置文件

client.ovpn文件
auth-user-pass #用户密码认证

windows客户端重新登录

安卓手机端配置

Type选择
User/PW + Certificates

最后修改日期: 2024年6月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。