天天看點

在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. rem check username and password with password.txt file
  11. for /f "tokens=1,2,3 delims=, " %%i in (password.txt) do if %%i==%user% if %%j==%pass% if %%k==1 exit /B 0
  12. 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為禁用);每個參數之間用,(逗号)分開;

完成以上工作後,就可以啟動伺服器了,然後再啟動用戶端了。