Всем доброго времени суток.
Так уж сложилось исторически, что электронные ключи организаций нашего небольшого холдинга для программы электронного документооборота SBIS были импортированы в реестр windows каждой рабочей станции, каждого пользователя.
При создании нового рабочего места выгружался куст с ключами из ветки Crypto-Pro и импортировался новому пользователю.
На терминальном сервере, понял, что такое недопустимо и решил выгрузить все ключи на флешку и разрешить в Crypto-Pro внешние накопители.
Теперь при создании новых пользователей на терминальном сервере никаких телодвижений с электронными ключами делать не нужно.
Проблема была в том, что нужно конвертировать ASCII ключи из реестра в 16 ричные файлы.
Возможно я плохо умею «гуглить», но готовых решений по теме не нашел, по этому сделал собственный скриптик на bash.
Может, кому то пригодится.
Небольшое описание.
Ключи находятся в ветке реестра — [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Users\SID-пользователя\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
ссылка на оригинал статьи http://geektimes.ru/post/259544/
Добавить комментарий