Січ 142012
 

Восстановление отозванного сертификата openvpn

OpenSSL хранит статус каждого сертификата в ${CATOP}/index.txt, для OpenVPN это easy-rsa/keys/index.txt. На основе этого файла генерируется CRL (certificate revocation list).

Так выгялядят рабочий и отозванный сертификаты:
V       201120070444Z           22      unknown /C=RU/ST=Ru/L=Belgorod/O=FIT/CN=goodboy/emailAddress=admin@fabit.ru
R       201217190136Z   110830061053Z   23      unknown /C=RU/ST=Ru/L=Belgorod/O=FIT/CN=hmmboy/emailAddress=admin@fabit.ru
Для восстановления отозванного сертификата нужно отредактировать это файл. Заменить в строке соответствующей отозванному сетификату R на V и удалить третий столбец (это дата отзыва). Колонки разеделены табуляций, если нарушить это разделение, то можно похерить CA. Поэтому никаких пробелов и MS Word’ов.
После сохранения изменений нужно перегенерировать CRL. Возможно есть более гуманные способы, но приведенный ниже занял меньше всего времени по его поиску и возможности повторого использования. Скрипт revoke-full перегененрирует CRL, скопируем его в crl-regen и закомментируем строки ответственные за отзыв сертификата.
#!/bin/bash
CRL="crl.pem"
RT="revoke-test.pem"

#if [ $# -ne 1 ]; then
#    echo "usage: revoke-full <cert-name-base>";
#    exit 1
#fi

if [ "$KEY_DIR" ]; then
    cd "$KEY_DIR"
    rm -f "$RT" 

    # set defaults
    export KEY_CN=""
    export KEY_OU=""
    export KEY_NAME=""

#    # revoke key and generate a new CRL
#    $OPENSSL ca -revoke "$1.crt" -config "$KEY_CONFIG" 

    # generate a new CRL -- try to be compatible with
    # intermediate PKIs
    $OPENSSL ca -gencrl -out "$CRL" -config "$KEY_CONFIG"
    if [ -e export-ca.crt ]; then
        cat export-ca.crt "$CRL" >"$RT"
    else
        cat ca.crt "$CRL" >"$RT"
    fi

#    # verify the revocation
#    $OPENSSL verify -CAfile "$RT" -crl_check "$1.crt"
else
    echo 'Please source the vars script first (i.e. "source ./vars")'
    echo 'Make sure you have edited it to reflect your configuration.'
fi
Далее через скрипт list-crl можно поглядеть на отсутствие сертификата в списке отозванных. Так же помним о необходимости установить переменные среды через vars.