在windows下实现open***的user/pass及证书验证

我这里用的最新的版本open***-install-2.4.8-I602-Win10,有些参数在老版本上是没有的。

下面先给出服务器端的配置文件server.ovpn,配置文件实现客户端固定IP和用户名密码验证。

port 443
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key

dh dh2048.pem

tls-auth ta.key 0

script-security 2
auth-user-pass-verify author.bat via-file
#client-cert-not-required
verify-client-cert
username-as-common-name


server 10.8.0.0 255.255.255.0

push "route 192.168.1.0 255.255.255.0"

client-to-client
keepalive 10 120
cipher AES-256-CBC

comp-lzo
persist-key
persist-tun

status openvpn-status.log
log-append openvpn.log
verb 3

ifconfig-pool-persist ipp.txt

;client-connect 
client-config-dir "C:\\Program Files\\OpenVPN\\ccd"
route 10.9.0.0 255.255.255.252

用户明密码验证需要下面两个参数:

script-security 2  #新版本中必须有这个参数,否则不会调用外部脚本;老版本可以不要,这个在很多的配置文件中都没有

auth-user-pass-verify  author.bat via-file  #这里面的author.bat用来进行身份验证的脚本,后面via-file表示是通过临时文件来存储用户提交的用户名及密码;

指定IP地址用到的两个参数:

client-config-dir "C:\\Program Files\\OpenVPN\\ccd"   #通过指定ccd文件夹下的文件来获取客户端的IP,文件名与生成的客户端       认证文件名相同,不带后缀,我生成的client.key ,这里的文件名为client ,文件内容:  ifconfig-push 10.9.0.1 10.9.0.2   则用          client客户端的地址为10.9.0.1
route 10.9.0.0 255.255.255.252

 

下面是客户端的配置文件:client.ovpn

  1. client

    ;dev tap
    dev tun

    ;proto tcp
    proto udp

    remote 117.*.*.* 443  #服务器端的IP地址或网址+端口号

    resolv-retry infinite

    nobind

    # Downgrade privileges after initialization (non-Windows only)
    ;user nobody
    ;group nobody

    auth-user-pass

    # Try to preserve some state across restarts.
    persist-key
    persist-tun
    ca ca.crt
    cert client.crt
    key client.key


    remote-cert-tls server

    tls-auth ta.key 1

    cipher AES-256-CBC

    comp-lzo

    verb 3

其中的auth-user-pass 说明向服务器发送用户名及密码来进行认证。

 

下面是进行身份验证的脚本author.bat,放到服务器端,为了方便起见,这里放到了与配置文件一个目录下面,你也可以放到任意的地方,只需修改服务器配置文件server.ovpn中的相应参数即可。

  1. @echo off
  2. rem get username and password from temp file as %1
  3. set v=1
  4. for /f  %%i  in (%1) do (
  5. if !v!==1 (
  6. set user=%%i
  7. set v=2
  8. )else set pass=%%i 
  9. )
  10.  
  11. rem check username and password with password.txt file
  12.  
  13. for /f "tokens=1,2,3 delims=, " %%i in (password.txt) do if %%i==%user% if %%j==%pass% if %%k==1 exit /B 0
  14.  
  15. echo 1

批处理文件中的第3行到第9行是用来读取临时文件中存储的客户机提交上来的用户名及密码,文件名做为一个参数传入到批处理文件里来,因此在for 语句中用了%1来获取文件名,临时文件中第一行是客户提交用户名,第二行密码,文件在脚本结束后自动删除;另外在循环里面要修改参数v的值,为此需要cmd即命令行使用延时加载(具体内容可以参见前面的文章:批处理问题:SET 命令在 FOR 循环中失效 / SET 环境变量生存域/作用域),延时加载可以用 cmd /v:on来启动,也可在注册表做以下设定来启动:

在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的延迟扩展,这要通过设置使用 REGEDT.EXE 的注册表中的一个或两个 REG_DWORD 值,如果没有可以新建:

    HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/DelayedExpansion

        和/或

    HKEY_CURRENT_USER/Software/Microsoft/Command Processor/DelayedExpansion

值为0x1(启用延时加载) 或 0x0(不启用延时加载)

 

批处理的13到15行是通过读取服务器上用户名及密码的文件password.txt,来查找是否有与客户机相匹配的用户,如果有就返回0,如果没有就返回1。

passowrd.txt文件内容如下:

  1. client, password, 1
  2. a1,123,0

第一个是用户名,第二个是密码,第三个是帐户是否启用(1为启用,0为禁用);每个参数之间用,(逗号)分开;

完成以上工作后,就可以启动服务器了,然后再启动客户端了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 在前端页面中,通过监听输入框的键盘抬起事件,获取输入的用户名。 2. 发送一个ajax请求到后端,传递用户名参数。 3. 后端接收到请求后,查询数据库中是否存在该用户名。 4. 如果存在该用户名,则返回错误信息给前端。如果不存在,则返回成功信息。 5. 前端页面根据返回的信息,显示相应的提示,例如红色字体提示“用户名已存在”或绿色字体提示“用户名可用”。 以下是大致的示例代码: 前端页面: ``` <input type="text" id="username" onkeyup="checkUsername()" /> <div id="username_tip"></div> <script> function checkUsername() { var username = document.getElementById("username").value; var xhr = new XMLHttpRequest(); xhr.open('POST', 'check_username.php', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { var response = JSON.parse(xhr.responseText); if (response.result === 'fail') { document.getElementById("username_tip").innerHTML = "<span style='color: red;'>用户名已存在</span>"; } else { document.getElementById("username_tip").innerHTML = "<span style='color: green;'>用户名可用</span>"; } } } }; xhr.send('username=' + encodeURIComponent(username)); } </script> ``` 后端代码(使用PHP语言): ``` <?php $db_host = 'localhost'; $db_name = 'test'; $db_user = 'root'; $db_pass = ''; $username = $_POST['username']; try { $dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8mb4"; $pdo = new PDO($dsn, $db_user, $db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE username = ?"); $stmt->execute([$username]); $count = $stmt->fetchColumn(); if ($count > 0) { echo json_encode(array("result" => "fail")); } else { echo json_encode(array("result" => "success")); } } catch(PDOException $e) { echo json_encode(array("result" => "error", "message" => $e->getMessage())); } ?> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值