web-dev-qa-db-ja.com

OpenVPNサーバーはクライアントを無効にして有効にします

Ubuntu14.04サーバーマシンでOpenVPN2.3.2(まだ初心者)を実行しています。 OpenVPNサーバーに接続するクライアントを無効化/再有効化できるようにしたい。

クライアントの証明書を取り消すための this ガイドに従いましたが、この移動は元に戻せないようです。また、クライアントの証明書を取り消すと、クライアントがすでに接続されている場合、接続が停止していないように見えます。接続をすぐに停止したい。

クライアントを無効にしてから再度有効にする簡単な方法はありますか?

私のserver.confファイル:

# OpenVPN server configuration file
dev tun
proto udp
port 1194
server 10.8.0.0 255.255.255.0
ca /usr/share/easy-rsa/keys/ca.crt
cert /usr/share/easy-rsa/keys/vpnserver.crt
key /usr/share/easy-rsa/keys/vpnserver.key
dh /usr/share/easy-rsa/keys/dh2048.pem
Push "dhcp-option DNS 8.8.8.8"
Push "redirect-gateway def1"
comp-lzo
keepalive 10 60
persist-tun
persist-key
user panos
group panos
log-append /var/log/openvpn.log
verb 3
# crl-verify keys/crl.pem

最後の行は上記のガイド用です。

ありがとうございました。

2
panos

Davidgoと同様のソリューションを実装しました。残念ながら、 このバグ のようなopensslエラーに直面し、この回避策を見つけるのに多くの時間がかかりました。

最後に、クライアント証明書を取り消す、および取り消さないための2つのスクリプトを作成しました。

revoke.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
fileline="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $fileline | awk -F' ' '{print NF;}')"

if [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    source /usr/share/easy-rsa/vars 
    /usr/share/easy-rsa/revoke-full $1

    {
        sleep 3
        echo kill $1
        sleep 3
        echo exit
    } | telnet localhost 7505

    echo "Client certificate revoked successfully."
    exit 0;

Elif [[ $columns_number -eq 6 ]] && [[ $fileline == R* ]]; then

    echo "Client certificate is already revoked."
    exit 0;

else

    echo "Error; key index file may be corrupted."
    exit 1;
fi

unrevoke.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
linenumber="$(grep -n "/CN=$1/" $keys_index_file | cut -f1 -d:)"
fileline="$(grep -n "/CN=$1/" $keys_index_file)"
line="$(grep "/CN=$1/" $keys_index_file)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number



if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file
    cd /usr/share/easy-rsa; source ./vars; openssl ca -gencrl -out "keys/crl.pem" -config "$KEY_CONFIG"

    echo "Certificate unrevoked successfully."
    exit 0;

Elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

ご了承ください revoke.shスクリプトはまた、openVPNで telnet接続 を開き、取り消されるクライアントをキックアウトします。

2
panos

Iptablesオプション(技術的に優れていると思います)を無視すると、取り消しファイルを変更してopenvpnを再ロードすることで、秘密鍵を取り消して元に戻すことができます。 (easyRSAを使用している場合は、easyRSA/index.txtを編集できます。適切な行を見つけて「R」フラグを「V」フラグに変更し、3番目の列を削除します。)次に

  source ./vars
  openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"

開いているサーバーをリロードして、新しい構成を有効にすることができます。これにより、すべてのクライアントがキックされますが、クライアントは自動的に再接続して新しいセッションをネゴシエートする必要があります。

このソリューションの基になっている参照記事については、 http://sq4ind.eu/openvpn-revoke-unrevoke-certificates/ を参照してください。

0
davidgo