To od początku.
Zobacz na wpis który Ci podałem ver-pass.sh
#!/bin/sh
pass=`awk "\\\$1 == \"${username}\" { print substr(\\\$0,length(\\\$1)+2) }" /etc/openvpn/client/openvpn-auth`
#echo $pass >> /etc/openvpn/client/auth_txt
test -n "$pass" && test "$pass" == "${password}" && grep -w "$common_name $username" /etc/openvpn/client/userlist.txt && exit 0
#echo "grep -w $common_name $username /etc/openvpn/client/userlist.txt && exit 0" >> /etc/openvpn/uth_txt
exit 1
Zastanów się co on robi.
Pierwsza linia przypisanie hasła do zmiennej pass .Odchaszuj sobie echo jak wyżej i zobacz to naocznie w pliku.
Druga linia: Najpierw sprawdza czy zmienna $pass ma niezerową wartość, następnie porównuje ją ze zmienną $password (zmienna password to zmienna przekazywana Ci przez openvpn podczas łączenia się klienta). Tu masz wlaśnie sprawdzenie loginu i hasła Jeśli jest ok to przechodzi do następnego członu. Czyli grepa. W nim masz właśnie wspomnianą walidację Username = CN ($common_name $username - przekazywane Ci przez openvpn). Jeśli taki wpis istnieje w pliku to grep zakończy się statusem ok i przejdzie do dalszej części, a więc exit 0, co oznacza prawidłowe zakończenie skryptu. Jeśli nie to exit 1 i błąd. Tak się dzieje w twoim przypadku. Znowu włącz echo, aby to zobaczyć.
Czemu Ci się kończy błędem wykonanie skryptu? Tego nie wiem. Pokaż mi wpis z userlist, i wygenerowany podczas łączenie wspomniany auth.txt ponadto może nie masz zainstalowanego grep lub basha w systemie
Zrób mały test: Utwórz plik wykonywalny.
#!/bin/bash
grep -w "Jan Nowak jnowak" /etc/openvpn/client/userlist.txt
#grep -q "Jan Nowak jnowak" /etc/openvpn/client/userlist.txt
echo $?
I zobacz co będzie przy prawidłowym i nieprawidłowym wpisie w userlist. (-q -w zobacz raz tak, raz tak)
Co do weryfikacji samego certyfikatu. Tego dokonujesz w pliku vpncheckCN-cert. Działa to na podobnej zasadzie. Z przekazanego do skryptu całego DN sed wyłuskuje CN i szuka czy w userlist nie ma takiego wpisu.
grep -w "`echo "$3" | sed -r 's/.*CN=([^,]*),.*/\1/'`" $1 && exit 0
Jak byś się zagłębił troszkę w dokumentację , to byś zobaczył, że do takiego skryptu możemy podać wiecej różnych parametrów np:
X509_{n}_{subject_field}
An X509 subject field from the remote peer certificate, where n is the verification level. Only set for TLS connections. Set prior to execution of --tls-verify script. This variable is similar to tls_id_{n} except the component X509 subject fields are broken out, and no string remapping occurs on these field values (except for remapping of control characters to "_"). For example, the following variables would be set on the OpenVPN server using the sample client certificate in sample-keys (client.crt). Note that the verification level is 0 for the client certificate and 1 for the CA certificate.
X509_0_emailAddress
X509_0_CN
X509_0_O
X509_0_ST
X509_0_C
X509_1_emailAddress
X509_1_O
X509_1_L
X509_1_ST
X509_1_C
Czyli możesz sobie dopisać do skryptu dodatkowe parametry do walidacji np wszystkie certy z OU=Kierownicy będą mieli dostęp itp.
Tu masz wszystkie zmienne: https://community.openvpn.net/openvpn/w … nPage#lbAR