...
分享 OpenVpn

OpenVpn 实现客户端账号密码登录

之前做过几期OpenVpn异地组网教程
是使用证书来登陆客户端的
由于证书每次生成比较繁琐
所以再出一个通过账号密码登陆的教程
但是账号密码登录的方式还是没有证书安全!!!

那就开始吧:
安装服务端与客户端的软件首先生成ca.crt和dh2048.pem,server.crt,server.key这个是必要的。
客户端的话就只用服务端的ca.crt证书就行
且先看看这个文章:OpenVpn 搭建虚拟局域网服务 Windows篇

服务端:

1)取消证书验证
到server.ovpn添加下面几行代码:

client-cert-not-required
auth-user-pass-verify checkpsw.exe via-env
script-security 3

看别人的教程有这么一段,我没加也可以正常连接,不知道是什么。可以忽略

;username-as-common-name

2)checkpsw 验证
checkpsw.exe 文件在这里下载 包含源代码 checkpsw.c
下载地址:checkpsw.zip

PS:如果需要修改 用 gcc 命令编译即可
c源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024

int checkpsw(char *username, char *password)
{
    FILE *f;
    char user[MAX + 2], pass[MAX + 2], active[MAX + 2];
    if (!(f = fopen("userpwd", "r")))
    {
        perror("Open PASSWORD file error");
        printf("The password file not found\n");
        return -1;
    }
    while (!feof(f))
    {
        fscanf(f, "%s %s %s\n", user, pass, active);
        if (strcmp(username, user) == 0 && strcmp(password, pass) == 0 && strcmp(active, "1") == 0)
        {
            fclose(f);
            return 0;
            //验证通过应该返回0;
        }
    }
    fclose(f);
    return 1;
}

int main()
{
    int status;
    status = checkpsw(getenv("USERNAME"), getenv("PASSWORD"));
    return status;
}

3)用户配置文件 userpwd

#用户名 密码 是否启用(0/1) 中间用空格隔开 
xiaoli 123456 1
xiaowang 654321 0

config 目录新建 userpwd 文件并拷贝 checkpsw.exe 程序
到此服务端就配置完毕了。

服务端配置参考:

local 0.0.0.0
port 9090
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher AES-256-CBC
comp-lzo
client-to-client
persist-key
persist-tun
status openvpn-status.log
verb 3
;username-as-common-name
client-cert-not-required
auth-user-pass-verify checkpsw.exe via-env
script-security 3

客户端:

删除 client.ovpncert XXXkey XXX 因为已经不需要证书验证了

在 client.ovpn 中添加配置

auth-user-pass

注意:ca证书要和服务器保持一致
可以加入 auth-nocache 可以在断线后防止内存中保存用户名和密码来提高安全性。
这样客户端就配好。

客户端配置参考:

client
dev tun
proto tcp
remote 0.0.0.0 9090
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
remote-cert-tls server
comp-lzo
verb 3

auth-user-pass
auth-nocache

然后客户端登陆就会提示输入密码,密码输入正确的话就能登陆了。

参考文档:

https://my.oschina.net/u/4413523/blog/3826380

http://www.89cool.com/811.html

https://www.bbsmax.com/A/kjdwZnB5Np/

mysql 开启远程登陆权限 liunx篇 mysql 数据库恢复 frm,ibd文件恢复数据 数据库修复
biu biu biu
vue-clipboard2(vue剪切板功能) PHP Nginx TP5 出现 require(): open_basedir restriction in effect /:/tmp/:/proc/ 报错 分享一个跨平台翻译软件TTime nodejs 获取命令行参数 js drag拖动排序