Белый список сертификатов в openvpn
Чтобы отозвать доступ к клиенту, я могу сделать
$./revoke-full client_name
А затем поместите новый crl.pem
на сервере.
Но как мне включить этого клиента? Удаление crl.pem
файл не является решением, потому что это сломается easy-keys
каталог, и я не смогу отозвать их снова, позже.
2 ответа
Сертификаты никогда не должны быть отменены! Вы должны сгенерировать новый и передать его клиенту.
... но все же, если вы хотите:
в вашей папке CA должен быть файл index.txt с идентификаторами сертификатов. Те, которые начинаются с "V", действительны, а те, что "R", отменяются. Вы можете отредактировать этот файл, исправить первый символ на "V" и удалить третий столбец (дата отзыва). Если у вас более одного сертификата, вы должны увидеть шаблон (порядковый номер теперь находится в третьем столбце и т. Д.).
Тогда вам просто нужно восстановить CRL снова, и это должно работать.
Это ужасный хак,... я все еще рекомендую создать новый сертификат для клиента.
Хотя переключение отзыва не очень хорошая практика, существует особый случай, когда отмена ключа (например, отмена) может быть полезной.
Хуже всего: ЭЛТ никогда не может быть удален, а не очень конкретные случаи, такие как учеба. В конце этого вы можете увидеть, как я удаляю последнюю запись индекса (как действие отмены).
unrevoke
Есть немного unrevoke
сценарий я написал.
Поскольку это не стандартная функция, я добавил своего рода файл журнала, который называется unrevoke.txt
в формате ASCII и повторного использования структуры index.txt (с разделителями табуляции):
U | Revocation date | Unrevocation date | Id | unknown | Subject
Предупреждаю: это работает для моих нужд, но вы должны проверить их перед регулярным использованием!
#!/bin/bash
# un-revoke a certificate, regenerate CRL,
# and verify revocation status
CRL=crl.pem
if test $# -ne 1; then
echo "usage: unrevoke <name|idx>";
exit 1
fi
if test $KEY_DIR; then
cd $KEY_DIR
read issuer < <(openssl x509 -issuer -noout -in $KEY_DIR/ca.crt)
issuer=${issuer#*CN=}
issuer=${issuer%%/*}
export KEY_CN=$issuer KEY_OU=$issuer KEY_NAME=$issuer
if [ -f $1.crt ] ;then
NAM=$1
REV=($(sed -ne <index.txt "s/^R\t[^\t]*\t\([0-9]\+Z\)\t\([0-9A-F]\{2,8\}\)\tunknown\t\(.*CN=$1\/.*\)$/\1 \2 \3/p"))
IDX=${REV[1]}
SUB="${REV[@]:2}"
else
if [ -f $1.pem ] ;then
IDX=$1
REV=($(sed -ne <index.txt "s/^R\t[^\t]*\t\([0-9]\+Z\)\t$1\tunknown\t\(.*CN=\([^\/]\+\)\/.*\)$/\1 \3 \2/p"))
NAM=${REV[1]}
SUB="${REV[@]:2}"
fi
fi
CRT=$IDX.pem
if [ -f $CRT ] && [ "$NAM" ] && [ "$IDX" ] ;then
printf "Key idx: %s, name: %s\n" $IDX $NAM
else
echo Key $1 not found.
exit 1
fi
DTE=$(date +"%y%m%d%H%M%SZ")
# unrevoke key
sed -e "s/^R\t\([0-9]\+Z\)\t[0-9]\+Z\t$IDX\t/V\t\1\t\t$IDX\t/" -i.old index.txt &&
printf "U\t%s\t%s\t%s\tunknown\t%s\n" $REV $DTE $IDX "$SUB" >>unrevoke.txt
# generate a new CRL
openssl ca -gencrl -out $CRL -config $KEY_CONFIG
# verify the revocation
openssl verify -CAfile <(cat ca.crt $CRL) -crl_check $CRT
else
echo you must define KEY_DIR
fi
удалить, последний
Только для информации!: ключ, чтобы НИКОГДА не удалялся, чтобы разрешить его отзыв!
#!/bin/bash
# For info only!!
# key as to NEVER be deleted
# for making a correct revocation liste
#
# Don't use it unless you're sure you know what you're doing!!!
cd $KEY_DIR || exit 1
mapfile index <index.txt
OIFS="$IFS"
IFS=$'\t'
line=(${index[${#index[@]}-1]})
IFS="$OIFS"
if [ "$line" == "V" ] ;then
idx=${line[2]}
nam=${line[4]#*CN=}
else
idx=${line[3]}
nam=${line[5]#*CN=}
fi
nam=${nam%%/*}
rm -v $nam.* $idx.*
unset index[${#index[@]}-1]
cat index.txt >index.txt.old
printf "%s" "${index[@]}" >index.txt
cat serial >serial.old
echo ${line[2]} >serial