|
发表于 2008-12-2 22:08:07| 字数 1,859| - 中国–山东–烟台 联通
|
显示全部楼层
|阅读模式
我用的是tomato的路由,现在我想在路由上建OPenvpn服务,但是我上网查了资料,好像网上的资料和介绍都是用静态key和ca验证的
大家可能听说过windows下有一种用user/password的验证的方式,不用为客户端颁发证书,只需要ca.KEY和ta.key就行了,然后在连接服务器的时候客户端输入用户和密码就可以。
至于OPenvpn服务器端的用户和密码的验证也有几种方式,一种是数据库,一种是调用外部程序,当然外部程序是windows平台运行的。在路由上用数据库显然行不通,我就想是不是用调用外部脚本的方式可以在路由实现user/password验证,从而摆脱多用户的时候要颁发多个证书,和吊销证书的玛麻烦。
windows的调用外部程序有两种一种是批处理bat文件,代码如下:
@echo off
rem get username and password from temp file as %1
set v=1
for /f %%i in (%1) do (
if !v!==1 (
set user=%%i
set v=2
)else set pass=%%i
)
rem check username and password with password.txt file
for /f "tokens=1,2,3 delims=, " %%i in (password.txt) do if %%i==%user% if %%j==%pass% if %%k==1 exit /B 0
exit /B 1
以上的脚本就会到password.txt这个文件里去验证用户和密码是否正确并却用户是否可用,文件格式为
zzx,zzx,1
zzx分别为用户和密码,1表示启动,0标示禁用
还有一种是C语言编的可执行程序exe文件
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1024
int checkpsw(char *username, char *password)
{
FILE *f;
char user[MAX+2], pass[MAX+2], active[MAX+2];
/* printf("%s,%s\n",username,password); */
if (!(f=fopen("password.txt", "r")))
{
perror("Open PASSWORD file error");
printf("Use password.txt as the password file\n");
printf("checkpsw for OpenVPN@WIN by ELM <wzk#wenzk.net>.\n");
return(1);
}
while(!feof(f))
{
fscanf(f,"%s %s %s\n",user,pass,active);
/* printf("user:%s pass:%s active:%s\n",user, pass, active); */
if (!strcmp(username,user) && !strcmp(password,pass) && !strcmp(active,"1"))
{
/* printf("OK\n"); */
fclose(f);
return (0);
}
}
fclose(f);
return (1);
}
void main()
{
int status;
/* printf("%s,%s",getenv("USERNAME"),getenv("PASSWORD")); */
status=checkpsw(getenv("USERNAME"),getenv("PASSWORD"));
return (status);
}
这个也是到password.txt里验证用户和密码,格式为
zzx zzx 1
所以我就像,既然windows下可以调用外部脚本,那么路由的tomato也就是linux也可以调用,但是不知道linux下的用户和密码验证程序代码怎么编写,有么有高人帮忙写一段,谢谢了 ![](static/image/smiley/default/face5.gif)
或者谁告诉我linux下面C语言编程怎么弄,头文件怎么写?编译怎么编译?还有怎么执行?
[ Edited by 窒息的邂逅 on 2008-12-2 22:27 ] |
|