Всем доброго времени суток.
Так уж сложилось исторически, что электронные ключи организаций нашего небольшого холдинга для программы электронного документооборота SBIS были импортированы в реестр windows каждой рабочей станции, каждого пользователя.
При создании нового рабочего места выгружался куст с ключами из ветки Crypto-Pro и импортировался новому пользователю.
На терминальном сервере, понял, что такое недопустимо и решил выгрузить все ключи на флешку и разрешить в Crypto-Pro внешние накопители.
Теперь при создании новых пользователей на терминальном сервере никаких телодвижений с электронными ключами делать не нужно.
Проблема была в том, что нужно конвертировать ASCII ключи из реестра в 16 ричные файлы.
Возможно я плохо умею «гуглить», но готовых решений по теме не нашел, по этому сделал собственный скриптик на bash.
Может, кому то пригодится.
Небольшое описание.
Ключи находятся в ветке реестра — [HKEY_LOCAL_MACHINESOFTWAREWow6432NodeCrypto ProSettingsUsersSID-пользователяKeysНазвание-ключа]
Структура ключа в выгруженной ветке реестра:
«name.key»=hex:10,d5…
«header.key»=hex:20,42,19,…
«primary.key»=hex:30,12
«masks.key»=hex:30,23
«primary2.key»=hex:30,12…
«masks2.key»=hex:30,56,10…
В качестве параметра скрипту необходимо указать файл с выгруженными ключами из реестра (например keys.reg).
В результате работы скрипта создастся папка keys в корневой директории из которой запускали скрипт и внутри нее папки с названием ключей. Папки с названием ключей будут содержать по 6 файлов — name.key, header.key, primary.key, primary2.key, masks.key, masks2.key.
#!/bin/bash
path=./
temp=$path/temp
file[1]="name.key"
file[2]="masks.key"
file[3]="masks2.key"
file[4]="primary.key"
file[5]="primary2.key"
file[6]="header.key"
if [ ! -d "$temp" ]; then
mkdir "$temp"
fi
if [ ! -d "$path/keys" ]; then
mkdir "$path/keys"
fi
# CR to LF. Конвертируем файл в формат UNIX (Окончания строк LF, вместо CR)
dos2unix -n -q $1 $temp/$1
# Записываем имена всех ключей во временный файл
cat $temp/$1 | grep -E -o 'Keys\w+]' | sed -E 's/Keys\//; s/]//' > $temp/keysname
while read key
do
# Записываем полное содержимое ключа в отдельный файл с его именем
cat $temp/$1 | sed -e '/./{H;$!d;}' -e "x;/$key]/!d" | sed -n "/$key]/!p" > $temp/$key
# Разделяем ключи (name, primary, masks, header...) и записываем в отдельные файлы в папку с именем ключа
if ! [ -d "$path/keys/$key" ]; then
mkdir "$path/keys/$key"
fi
for i in {1..6};
do
hex=$(cat $temp/$key | tr -d 'n' | sed -E 's/\//g; s/ //g; s/$//g' | grep -E -o "${file[$i]}"=hex:(w{2},?)+?" | sed -E "s/${file[$i]}"=hex://; s/,//g" | sed -E 's/w{2}/\x&/g')
echo -e -n "$hex" > "$path/keys/$key/${file[$i]}"
# LF to CR ???
# sed 's/$'"/`echo \r`/" "$path/keys/${file[$i]}" > "$path/keys/${file[$i]}"
done
done < $temp/keysname
# Очистка временных файлов
if [ -d "$temp" ]; then
rm -rf "$temp"
fi
exit 0
Автор: Bearpuh