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.ovpn 的 cert XXX 及 key 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