Проверка сертификатов

Обсуждение ПО используемого нами для решения тех или иных задач (Антивирусы, движки BD, файрволлы и т.п.)
Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Проверка сертификатов

Сообщение Val » 24.11.2009 11:30

Скрипт реализует проверку сертификатов из 3х источников: база АС Бюджет, сервер СА, сервер УРМ.
Позволяет увидеть просроченные или отклоненные сертификаты, которые нужно убрать из того или иного хранилища.
Нужен certadm.dll
Примерный вывод:
===== берем записи из базы ас бюджет и смотрим сертификаты на СА и УРМ сервере =====
===== Сравнение данных в базе ас бюджет с данным на сервере сертификатов и на сервере урм =====
-----------------------------------------------------
в базе ас бюджета : 61df815b000000000013 | Кухаривское с/п | 82 |
на сервере сертификатов : 61df815b000000000013 | Ростопша_Е_А
на сервере урм : Empty
Сертификат просрочен
-----------------------------------------------------
в базе ас бюджета : 61e044fd000000000014 | Кухаривское с/п | 82 |
на сервере сертификатов : 61e044fd000000000014 | Бутко_Л_В
на сервере урм : Empty
Сертификат просрочен
-----------------------------------------------------
в базе ас бюджета : 15ccbd9700000000009f | МУ ОМР | 51 |
на сервере сертификатов : 15ccbd9700000000009f | Скрипка_Т_Н
на сервере урм : Empty

-----------------------------------------------------
в базе ас бюджета : 16ef0fc20000000000c4 | МУ ОМР | 51 |
на сервере сертификатов : 16ef0fc20000000000c4 | Степанова_Н_А
на сервере урм : 16ef0fc20000000000c4 | Степанова_Н_А
Сертификат отозван
-----------------------------------------------------
в базе ас бюджета : 66b0fb44000000000067 | СОШ 3 Воронцовка | 129 |
на сервере сертификатов : 66b0fb44000000000067 | Григорян_А_А
на сервере урм : Empty
Сертификат отозван
-----------------------------------------------------
в базе ас бюджета : 32f44b0f000000000029 | Забота с 11.01.09г. переведено на обслуживание в ЦБ | 151 |
на сервере сертификатов : 32f44b0f000000000029 | Данильченко_В_В
на сервере урм : Empty
Сертификат отозван
-----------------------------------------------------
в базе ас бюджета : 32f32fd6000000000028 | Забота с 11.01.09г. переведено на обслуживание в ЦБ | 151 |
на сервере сертификатов : 32f32fd6000000000028 | Скрипникова_И_Н
на сервере урм : Empty
Сертификат отозван
-----------------------------------------------------
в базе ас бюджета : 4e29b26b000000000057 | ЦБ Копанского сп | 153 |
на сервере сертификатов : 4e29b26b000000000057 | Скрипникова_И_Н
на сервере урм : Empty
Сертификат отозван
Успешно
===== проверка хранилища СА (кроме отозванных) =====
Сертификат просрочен : 61121eef000000000002 | тестФ_т_т | | 20080709 | 20090709
Сертификат просрочен : 6132de1f000000000003 | тестФА_т_т | тестПредпр | 20080801 | 20090801
Сертификат просрочен : 611f3267000000000004 | Ыкюпя_Ы_Ы | тестПредпр | 20080808 | 20090808
Сертификат просрочен : 612cfde3000000000005 | тестФа_т_т | тест сокрпредпр 0908 | 20080908 | 20090908
Сертификат просрочен : 6160cf7d000000000006 | Пашкульская_А_В | МУ ЦБ ОУ Ейского района | 20081017 | 20091017
Сертификат просрочен : 61769e70000000000007 | Пашкульская_А_В | МУ ЦБ ОУ Ейского района | 20081017 | 20091017
Сертификат просрочен : 6114eeea000000000008 | Воликова_Л_Е | МУ Ейского района ЦБ учреждений здравоохранения | 20081031 | 20091031
Сертификат просрочен : 61165a04000000000009 | Агеева_В_В | МУ Ейского района ЦБ учреждений здравоохранения | 20081031 | 20091031
Сертификат просрочен : 196a1ee900000000000a | Щербак_Г_В | МУ ЦБ ОУ Ейского района | 20081105 | 20091105
Сертификат просрочен : 1a4135b800000000000b | Лемешко_Л_В | МУК ЦБУКИ Ейского района | 20081105 | 20091105
Сертификат просрочен : 1a42020900000000000c | Рашевский_А_М | МУК ЦБУКИ Ейского района | 20081105 | 20091105
Сертификат просрочен : 396c30d800000000000d | Компаниец_В_Ю | МУ МЦ Меотида | 20081111 | 20091111
Сертификат просрочен : 396cdd5100000000000e | Шамиева_О_Е | МУ МЦ Меотида | 20081111 | 20091111
Сертификат просрочен : 5c5e679900000000000f | Чистяков_И_Н | МУ Комплекный центр молодежи | 20081118 | 20091118
Сертификат просрочен : 5c5efd44000000000010 | Алексеева_Т_С | МУ Комплекный центр молодежи | 20081118 | 20091118
Сертификат просрочен : 616e4b18000000000011 | Шурунова_Е_В | Администрация Ейского сельского поселения Ейского района | 20081119 | 20091119
Сертификат просрочен : 616f63c5000000000012 | Гвоздева_Т_И | Администрация Ейского сельского поселения Ейского района | 20081119 | 20091119
Сертификат просрочен : 61df815b000000000013 | Ростопша_Е_А | Кухаривское с п | 20081119 | 20091119
Сертификат просрочен : 61e044fd000000000014 | Бутко_Л_В | Кухаривское с п | 20081119 | 20091119
Сертификат просрочен : 673922ef000000000015 | Киримлиди_Н_А | МОУ СОШ 2 п Октябрьский | 20081120 | 20091120
Сертификат просрочен : 67399637000000000016 | Голикова_О_Н | МОУ СОШ 2 п Октябрьский | 20081120 | 20091120
Сертификат просрочен : 687081d7000000000017 | Кононенко_С_Г | МОУ СОШ 5 ст Должанской | 20081120 | 20091120
Сертификат просрочен : 6870dff6000000000018 | Бабарицкая_Г_А | МОУ СОШ 5 ст Должанской | 20081120 | 20091120
Сертификат просрочен : 6d04e066000000000019 | Сапунова_Т_А | МОУ СОШ 20 г Ейска | 20081121 | 20091121
Сертификат просрочен : 6d05453600000000001a | Демиденко_А_А | МОУ СОШ 20 г Ейска | 20081121 | 20091121
===== проверка хранилища УРМ =====
Сертификат отозван : 438deebf00000000004e | Турищева_Е_А | Администрация Красноармейского сельского поселения | 20090113 | 20100113
Сертификат отозван : 3d32e6ec00000000002f | Ларькова_Н_И | ГСОУ школа интернат с Воронцовка Краснодарского кра | 20081210 | 20091210
Сертификат отозван : 16ef0fc20000000000c4 | Степанова_Н_А | МУ ОМР | 20090902 | 20100902
Сертификат отозван : 2352f789000000000025 | Токарь_А_А | МОУ СОШ 1 ст Ясенская | 20081205 | 20091205
Сертификат отозван : 438eb96b00000000004f | Игнашова_С_А | Администрация Красноармейского сельского поселения | 20090113 | 20100113
Сертификат отозван : 6bd0f1e6000000000071 | Качевская_В_Н | МОУ СОШ 14 ст Должанская | 20090121 | 20100121
Сертификат отозван : 3d325ac300000000002e | Житкова_И_В | ГСОУ школа интернат с Воронцовка Краснодарского кра | 20081210 | 20091210
Сертификат отозван : 66e2beb800000000006b | Новичихина_О_С | МОУ СОШ 7 г Ейска | 20090120 | 20100120
Сертификат отозван : 3df63cda00000000004c | Курганская_О_В | МОУ СОШ N9 с Кухаривка | 20090112 | 20100112
Сертификат отозван : 384ed53d000000000049 | Перелица_И_В | Служба спасения г Ейска | 20090111 | 20100111
Сертификат отозван : 06c6b39900000000007c | Кокин_А_В | МОУ НОШ 34 | 20090126 | 20100126
Сертификат отозван : 161ecc76000000000037 | Карпова_Т_М | МОУ НОШ 16 г Ейска | 20081218 | 20091218

код скрипта на perl

Код: Выделить всё

# Val, Ейский район, 23112009
# v. 0.8.0. дорабатываеть уже наверно не буду
# Читает
# 1.Список сертификатов из CA OKZFUХХ
# 2.Данные с РМ Администрирование УРМ - Права удаленных клиентов
# 3.Список сертификатов с сервера УРМ одним из двух методов:
#          а) если скрипт запущен на сервере УРМ, то читается прямо хранилище MY
#         б) если не на сервере УРМ, то нужно на сервере УРМ запустить скрипт code_sert_out.pl,
#            который сохранит в файл список сертификатов из хранилища MY
#           ( не могу удаленно получить список сертификатов этого хранилища )
# Читаем данные из всех источников и формируем массив хешей вида { SN NAME ORG BEGIN END CERT }
# пример http://www.microsoft.com/technet/scriptcenter/solutions/camon.mspx
use strict;
use Win32::OLE;
use Data::Dumper;
use Win32::OLE::NLS qw(:LOCALE :DATE);
use DBI;
use constant {
   CV_OUT_BASE64HEADER   => 0 ,
   CV_OUT_BASE64   => 0x1 ,
   CV_OUT_BINARY   => 0x2 ,
   CV_OUT_BASE64REQUESTHEADER   => 0x3 ,
   CV_OUT_HEX   => 0x4 ,
   CV_OUT_HEXASCII   => 0x5 ,
   CV_OUT_BASE64X509CRLHEADER   => 0x9 ,
   CV_OUT_HEXADDR   => 0xa ,
   CV_OUT_HEXASCIIADDR   => 0xb ,
   CV_OUT_HEXRAW   => 0xc ,
   CV_OUT_ENCODEMASK   => 0xff ,
   CV_OUT_NOCRLF   => 0x40000000 ,
   CV_OUT_NOCR   => 0x80000000 ,
   CVR_SEEK_NONE   => 0 ,
   CVR_SEEK_EQ   => 0x1 ,
   CVR_SEEK_LT   => 0x2 ,
   CVR_SEEK_LE   => 0x4 ,
   CVR_SEEK_GE   => 0x8 ,
   CVR_SEEK_GT   => 0x10 ,
   CVR_SEEK_MASK   => 0xff ,
   CVR_SEEK_NODELTA   => 0x1000 ,
   CVR_SORT_NONE   => 0 ,
   CVR_SORT_ASCEND   => 0x1 ,
   CVR_SORT_DESCEND   => 0x2 ,
   CV_COLUMN_QUEUE_DEFAULT   => -1 ,
   CV_COLUMN_LOG_DEFAULT   => -2 ,
   CV_COLUMN_LOG_FAILED_DEFAULT   => -3 ,
   CV_COLUMN_EXTENSION_DEFAULT   => -4 ,
   CV_COLUMN_ATTRIBUTE_DEFAULT   => -5 ,
   CV_COLUMN_CRL_DEFAULT   => -6 ,
   CV_COLUMN_LOG_REVOKED_DEFAULT   => -7 ,
   CVRC_COLUMN_SCHEMA   => 0 ,
   CVRC_COLUMN_RESULT   => 0x1 ,
   CVRC_COLUMN_VALUE   => 0x2 ,
   CVRC_COLUMN_MASK   => 0xfff ,
   CVRC_TABLE_REQCERT   => 0 ,
   CVRC_TABLE_EXTENSIONS   => 0x3000 ,
   CVRC_TABLE_ATTRIBUTES   => 0x4000 ,
   CVRC_TABLE_CRL   => 0x5000 ,
   CVRC_TABLE_MASK   => 0xf000 ,
   CVRC_TABLE_SHIFT   => 12 ,
   CAPICOM_LOCAL_MACHINE_STORE => 1,
   CAPICOM_CURRENT_USER_STORE => 2,
   CAPICOM_MEMORY_STORE => 0,
   CAPICOM_STORE_OPEN_READ_ONLY => 0,
   CAPICOM_STORE_OPEN_READ_WRITE => 1,
   #http://msdn.microsoft.com/en-us/library/aa376494(VS.85).aspx
   CAPICOM_CHECK_ONLINE_ALL => 0x000001EF,
   CAPICOM_TRUST_IS_NOT_TIME_VALID => 0x1,
   CAPICOM_TRUST_IS_REVOKED => 0x4,
   CAPICOM_LOCAL_MACHINE_STORE => 1,
   FILE_STORE => "U:/CP/urm_server/urm_server.dat", # файл откуда подгружаются результаты работы code_sert_out.pl
};

my $cols;
my $dbh;
#===============================================================================
# открыть базу АС Бюджет
sub openDB {
   my ($HOST_l,$DB_l,$USER_l,$PASSWORD_l,$CHARSET_l) = @_;
   my $DSN_l = "DBI:InterBase:database=$DB_l;host=$HOST_l;charset=$CHARSET_l;ib_charset=win_1251";
   $dbh = DBI->connect($DSN_l, $USER_l, $PASSWORD_l) or die "Can't connect to $DSN_l: $DBI::errstr";
}
#-------------------------------------------------------------------------------
# закрыть базу АС Бюджет
sub closeDB {
   $dbh->disconnect();
}
#===============================================================================
# имя колонки, кол-во колонок, массив колонок
# возвращает значение колонки по имени
sub getrecord() {
   my $strname = shift;
   my $maxrecord = shift;
   my $obj = shift; # ссылка на EnumCertViewColumn    
   my $res;
   ${$obj}->Reset; # позиционируем на первую запись
   # проходим по всем пока имя не совпадет с переданны парметром, тогда выйдем из цикла
   until (${$obj}->Next == -1) { if ($$obj->GetName eq $strname) {   $res = $$obj->GetValue(CV_OUT_BASE64); last; }   }   
   return $res;
}
#===============================================================================
# массив хешей, sn - серийный номер строка
# возвращает хеш по sn
sub getrecord2() {
   my $sb = shift;
   my $sn = shift;
   my $buf;
   foreach $buf (@{$sb}) {
      $sn=~ tr/[A-Z]/[a-z]/; # умнее не придумал
      %$buf->{"SN"}=~tr/[A-Z]/[a-z]/;
      if (%$buf->{"SN"} eq $sn) { return $buf };    
   };
return 0;
};
#===============================================================================
# сертификат
# возвращает результат проверки по CLR. 0 - норма, остальное ошибки
sub getchainres () {
  my $cert = shift;
  #http://msdn.microsoft.com/en-us/library/aa376494(VS.85).aspx
  $cert->IsValid->{CheckFlag} = CAPICOM_CHECK_ONLINE_ALL; # полная проверка с подключением к CA
  #http://msdn.microsoft.com/en-us/library/aa377611(VS.85).aspx
  my $chain = Win32::OLE->new('CAPICOM.Chain', sub {$_[0]->Close();}) or die "Cannot create CHAIN";   
  $chain->Build($cert);
  return $chain->Status;
};
#===============================================================================
# получает массив сертификатов из CA
sub getCA() {
   my %res;
   my @ret;
   Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);
   #http://msdn.microsoft.com/en-us/library/aa376092(VS.85).aspx
   my $cer2 = Win32::OLE->new('CAPICOM.Certificate.2') or die "Cannot create cer";
   #http://msdn.microsoft.com/en-us/library/aa385414(VS.85).aspx
   my $view = Win32::OLE->new('CertificateAuthority.View') || die Win32::OLE->LastError;
   $view->OpenConnection('OKZ01\OKZFU22');# || die "Error " . Win32::OLE->LastError; # коннект к CA
   my $intCount = $view->GetColumnCount(0); # количество колонок в view
   $view->SetResultColumnCount ($intCount);# || die Win32::OLE->LastError; # выбирать будем все
   for (my $i = 0; $i<= $intCount - 1; ++$i) {   $view->SetResultColumn($i); } # добавим в результирующие
   my $intIndex = $view->GetColumnIndex(CVRC_COLUMN_SCHEMA, 'RequestID') || die Win32::OLE->LastError; # ключ
   #http://msdn.microsoft.com/en-us/library/aa386231(VS.85).aspx
   my $rows = $view->OpenView || die Win32::OLE->LastError;
   $rows->Reset; # на первую
   until ($rows->Next == -1) {
        #http://msdn.microsoft.com/en-us/library/aa386176(VS.85).aspx
         $cols = $rows->EnumCertViewColumn;
        my $datebegin = &getrecord("NotBefore",$intCount,\$cols);
        my $dateend = &getrecord("NotAfter",$intCount,\$cols);
        $cols->Reset;
        my $str=&getrecord("RawCertificate",$intCount,\$cols); # получим сертификат в виде строки
        #$cer2->Import($str); # импортируем его
        push @ret,{ SN=>&getrecord("SerialNumber",$intCount,\$cols),NAME=>&getrecord("CommonName",$intCount,\$cols),ORG=>&getrecord("Organization",$intCount,\$cols),BEGIN=>$datebegin->Date('yyyyMMdd'),END=>$dateend->Date('yyyyMMdd'),CERT=>$str };
   }
   return \@ret; # вернем ссылку на массив хешей
}
#===============================================================================
# получает массив сертификатов из локального хранилища
sub getURMlocal () {
   my @ret;
   #http://msdn.microsoft.com/en-us/library/aa388120(VS.85).aspx
   my $Store = Win32::OLE->new('CAPICOM.Store', sub {$_[0]->Close();}) or die "Oops, cannot start CAPICOM";
   $Store->Open (CAPICOM_CURRENT_USER_STORE,'MY', CAPICOM_STORE_OPEN_READ_ONLY);
   my $Certificates = $Store->Certificates; # получим список сертификатов из хранилища
   #my $str = $Store->Export;         
   for ( my $i = 1 ; $i <= $Certificates->Count() ; $i++ ) { # по всем сертификатам
      my $Certificate = $Certificates->Item($i);
         $Certificate->SubjectName() =~ m/^CN=([0-9A-Za-zА-Яа-я_]+).+O=(([0-9A-Za-zА-Яа-я_]|\s)+).+/; # вытащим Имя и Организацию
         my $datebegin = $Certificate->ValidFromDate; # вытащим даты. Уже не обязательно, т.к. проверяю по Chain
         my $dateend = $Certificate->ValidToDate;
         push @ret,{ SN=>$Certificate->SerialNumber,NAME=>$1,ORG=>$2,BEGIN=>$datebegin->Date('yyyyMMdd'),END=>$dateend->Date('yyyyMMdd'),CERT=>$Certificate->Export };
   }
   return \@ret;
}
#===============================================================================
# получает массив сертификатов из файла
sub getURMfile () {
   my %res;
   my @ret;
   my $str2;
   open(FF2,"< ". FILE_STORE) || die "Cannot open URM certificates file !"; # читаем файл куда эксортировали сертификаты на другом компе
   read FF2, $str2,(-s FILE_STORE); # читаем весь файл в строку
   close FF2;
   #http://msdn.microsoft.com/en-us/library/aa388120(VS.85).aspx
   my $Store2 = Win32::OLE->new('CAPICOM.Store', sub {$_[0]->Close();}) or die "Cannot start CAPICOM";
   $Store2->Open (CAPICOM_MEMORY_STORE, 'VAL', CAPICOM_STORE_OPEN_READ_WRITE); # временное хранилище
   $Store2->Import($str2); # импортируем во временное хранилище
   my $Certificates2 = $Store2->Certificates; # список сертификатов
   for ( my $i = 1 ; $i <= $Certificates2->Count() ; $i++ ) { # по всему списку сертификатов
      my $Certificate2 = $Certificates2->Item($i);
         $Certificate2->SubjectName() =~ m/^CN=([0-9A-Za-zА-Яа-я_]+).+O=(([0-9A-Za-zА-Яа-я_]|\s)+).+/; # вытащим Имя и Организацию
         my $datebegin = $Certificate2->ValidFromDate; # вытащим даты. Уже не обязательно, т.к. проверяю по Chain
         my $dateend = $Certificate2->ValidToDate;
         push @ret,{ SN=>$Certificate2->SerialNumber,NAME=>$1,ORG=>$2,BEGIN=>$datebegin->Date('yyyyMMdd'),END=>$dateend->Date('yyyyMMdd'),CERT=>$Certificate2->Export };
   }
   return \@ret;
}
#===============================================================================
# получает массив номеров сертификатов из базы АС Бюджет
sub getDB {
   my $DB_HOST = 'bigfinupmain';
   my $DB_NAME_DB = 'D:\BudgetAx2009\Database\BUDGET2009.GDB';
   my $DB_NAME_REG = 'D:\BudgetAx2009\Database\DBREG2009.GDB';
   my $DB_CHARSET = 'WIN1251';
   my $DB_USER = 'sysdba';
   my $DB_PASSWORD = 'password';
   my $dsn_db = "DBI:InterBase:database=$DB_NAME_DB;host=$DB_HOST;charset=$DB_CHARSET;ib_charset=win_1251";
   my $dsn_reg = "DBI:InterBase:database=$DB_NAME_REG;host=$DB_HOST;charset=$DB_CHARSET;ib_charset=win_1251";
   my $sth;
   my %res;
   my @ret;   
   openDB($DB_HOST,$DB_NAME_DB,$DB_USER,$DB_PASSWORD,$DB_CHARSET);
   $sth = $dbh->prepare("SELECT id,clientid,note,cryptoid FROM remoteclient"); # запрос
   $sth->execute(); # выполняем запрос
   while ( $res = $sth->fetchrow_hashref ) { # прочитаем одну запись из дб в виде хэша
        my $ci = $res->{CRYPTOID};     # это поле с номерами сертификатов, их может быть несколько
        my @cia = split /, /,$ci;        # побъем их - разделитель запятая с пробелом
        # для каждорго сформируем хеш в результате
        foreach (@cia) {  push @ret,{ SN=>$_, ID=>$res->{ID}, CLIENTID=>$res->{CLIENTID}, ORG=>$res->{NOTE} }     };         
   };
   $sth->finish();
   closeDB();
   return \@ret;
};
#===============================================================================
# проверка соответстия записей в ас бюджет и сертификатов в урме и са
sub cmpcert() {
   my $sdb = shift; # массив хешей из базы ас бюджет
   my $sca = shift; # из СА
   my $surm = shift; # с сервера урма
   #http://msdn.microsoft.com/en-us/library/aa376092(VS.85).aspx
   my $cer2 = Win32::OLE->new('CAPICOM.Certificate.2') or die "Cannot create cer";
   my $res;
   my $flag;
   my $buf;
   logstr("===== Сравнение данных в базе ас бюджет с данным на сервере сертификатов и на сервере урм =====\n");
   foreach $buf (@{$sdb}) { # для всех хешей из бд
            $flag="";
            my $resurm =  &getrecord2($surm,$buf->{SN}); # возвращаем запись с таким же SN с сервера урм
            my $resca =  &getrecord2($sca,$buf->{SN}); # возвращаем запись с таким же SN из СА
            #$cer2->Import($resca->{CERT});
            if ($resca->{CERT} ne "") {   $cer2->Import($resca->{CERT})   } # берем сертификат если номер из СА не пустой
            elsif ($resurm->{CERT} ne "") {  $cer2->Import($resurm->{CERT})   } # берем сертификат если номер из УРМ не пустой
            else { logstr("!!! Для $buf->{SN} невозможно загрузить сертификат ни для СА, ни для УРМ \n"); return 99; };
            $res = &getchainres($cer2);        # проверяем сертификат
            if  ($res == CAPICOM_TRUST_IS_REVOKED) { $flag="Сертификат отозван" }
            elsif ($res == CAPICOM_TRUST_IS_NOT_TIME_VALID) {  $flag="Сертификат просрочен" }
             elsif ($res != 0) { $flag="Ошибка сертификата" };
            if ( $res != 0 || $resca->{CERT} eq "" || $resurm->{CERT} eq "" ) { # вывод только в том случае если какая либо ошибка     
               logstr("-----------------------------------------------------\n");
                logstr("в базе ас бюджета       : " . $buf->{SN} . " | " . $buf->{ORG} . " | " .  $buf->{CLIENTID} . " | " . "\n" );
               logstr("на сервере сертификатов : ");
               if ($resca) { logstr($resca->{SN} . " | " . $resca->{NAME} ) } else { logstr("Empty") };
               logstr("\n");
               logstr("на сервере урм          : ");
               if ($resurm) { logstr($resurm->{SN} . " | " . $resurm->{NAME}) } else { logstr("Empty") };
               logstr("\n");
               logstr("$flag");
               #if (&getchainres($cer2) == 0) { logstr("проверка сертификата успешна\n"); }
               #elsif  (&getchainres($cer2) == CAPICOM_TRUST_IS_REVOKED) { logstr("сертификат просрочен\n"); }
               #elsif (&getchainres($cer2) == CAPICOM_TRUST_IS_NOT_TIME_VALID) {  logstr("сертификат отозван\n"); };
               logstr("\n");
             };   
         };
   logstr("Успешно\n");      
   return 0;
}
#===============================================================================
# проверка соответстия сертификатов в двух массивах
sub cmpcert2() {
   my $s1 = shift;
   my $s2 = shift;
   #http://msdn.microsoft.com/en-us/library/aa376092(VS.85).aspx
   my $cer = Win32::OLE->new('CAPICOM.Certificate.2') or die "Cannot create cer";
   my $flag;
   my $res = 0;
   logstr("-----------------------------------------------------\n");
   foreach $buf (@{$s1}) { # для всех записей в первом массиве
         $flag="";
         $cer->Import($buf->{CERT}); # импортируем сертификат
         $res = &getchainres($cer); # проверяем сертификат
         if  ($res == CAPICOM_TRUST_IS_REVOKED) { $flag="Сертификат отозван" }
         elsif ($res == CAPICOM_TRUST_IS_NOT_TIME_VALID) {  $flag="Сертификат просрочен" }
         elsif ($res != 0) { $flag="Ошибка сертификата" };
         if (&getrecord2($s2,$buf->{SN})) {
         
         } else {
                   logstr("-----------------------------------------------------\n");
               logstr("Сертификат $buf->{SN} | $buf->{NAME} | $buf->{ORG} | $buf->{BEGIN} | $buf->{END} \n");
                 logstr("Сертификат из 1го хранилища отсутствует во 2ом хранилище\n");
               if ($flag ne "") { logstr("Ошибка сертификата: $flag \n") };
         };   
   };
   logstr("Успешно\n");
   return 0;
};
#===============================================================================
# массив сертификатов, флаг (учитывать ли отклоненных)
sub check() {
   $s1 = shift; # массив хешей
   $f1 = shift;
   #http://msdn.microsoft.com/en-us/library/aa376092(VS.85).aspx
   my $cer = Win32::OLE->new('CAPICOM.Certificate.2') or die "Cannot create cer";
   my $res;
   my $flag;
   foreach $buf (@{$s1}) { # для всех записей в массиве
         $flag = "";
         $cer->Import($buf->{CERT}); # импортируем      
         $res = &getchainres($cer); # проверяем
         if  ($res == CAPICOM_TRUST_IS_REVOKED) { $flag="Сертификат отозван  " }
         elsif ($res == CAPICOM_TRUST_IS_NOT_TIME_VALID) {  $flag="Сертификат просрочен" }
         elsif ($res != 0) { $flag="Ошибка сертификата" };
         # условие - если (сертификат отозван и флаг) или (сертификат не отозван и ошибка)
         if (( $res == CAPICOM_TRUST_IS_REVOKED && $f1 == 1 ) or ( $res != CAPICOM_TRUST_IS_REVOKED && $res != 0 )) { logstr("$flag : $buf->{SN} | $buf->{NAME} | $buf->{ORG} | $buf->{BEGIN} | $buf->{END}\n") };            
   }
   return 0;
}
#===============================================================================
# логгирование
sub logstr() {
   $str = shift;
   print $str;
}
#===============================================================================
my @ca = @{&getCA()}; # читаем из СА
my @urm = @{&getURMfile()}; #  читаем из УРМ
# эту если не на сервере урма
my @db = @{&getDB}; # читаем из базы ас бюджет   
# или эту если пускаем на сервере урма
#my @urm = @{&getURMlocal()};
&logstr("===== берем записи из базы ас бюджет и смотрим сертификаты на СА и УРМ сервере =====\n");
&cmpcert(\@db,\@ca,\@urm); #
#&logstr("===== 1ое хранилище - сервер сертификтов, 2ое хранилище - сервер урм =====\n");
#&cmpcert2(\@ca,\@urm);
#&logstr("===== 1ое хранилище - сервер урм, 2ое хранилище - сервер сертификатов =====\n");
#&cmpcert2(\@urm,\@ca);
&logstr("===== проверка хранилища СА (кроме отозванных) =====\n");
&check(\@ca,0);
&logstr("===== проверка хранилища УРМ =====\n");
&check(\@urm,1);

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Проверка сертификатов

Сообщение Val » 24.11.2009 11:38

типа примера на VBA

Код: Выделить всё

Private Sub CommandButton1_Click()
Const CVR_SEEK_GT = &H10
Const CVR_SORT_DESCEND = &H2
Dim ad As New CERTADMINLib.CCertAdmin
Dim ca As New CCertView
Dim vi As CERTADMINLib.IEnumCERTVIEWROW
Dim col As CERTADMINLib.IEnumCERTVIEWCOLUMN
Dim attr As CERTADMINLib.IEnumCERTVIEWATTRIBUTE
Dim a As Long
Dim b As Long
Dim c As Integer
Dim d As String
'Dim strCAConfig  As String
Dim intCount As Integer
Dim i As Integer
Dim intIndex As Integer
'Dim conf As New CERTCLIENTLib.CCertConfig
'Set objCertConfig = CreateObject("CertificateAuthority.Config")
'strCAConfig = conf.GetConfig(0)

ca.OpenConnection ("OKZ01\OKZFU22")
intCount = ca.GetColumnCount(False)
ca.SetResultColumnCount (intCount)
For i = 0 To intCount - 1
    ca.SetResultColumn (i)
Next
'ca.SetResultColumnCount (2)
a = ca.GetColumnIndex(False, "RequestID")
b = ca.GetColumnCount(CVRC_COLUMN_VALUE)
intIndex = ca.GetColumnIndex(False, "RequestID")
ca.SetRestriction intIndex, CVR_SEEK_GT, CVR_SORT_DESCEND, 0
Set vi = ca.OpenView
Print vi.GetMaxIndex
If vi Is Nothing Then
    Print "halt"
    Exit Sub
End If
Do Until vi.Next = -1
    Set col = vi.EnumCertViewColumn()
    Set attr = vi.EnumCertViewAttribute(0)
    Do Until col.Next = -1
        'Print col.GetDisplayName
        d = col.GetName
        Debug.Print d
        Debug.Print col.GetValue(CV_OUT_HEXASCII)
        'Select Case col.GetDisplayName
         
            'Case "Binary Certificate":  Print col.GetValue(CV_OUT_HEXASCII)
            'Case "Request Disposition": Print objCol.GetValue(CV_OUT_HEXASCII)
        'End Select
    Loop
Loop

Call vi.Reset
Call vi.Skip(1)
'Set attr = vi.EnumCertViewAttribute(0)
'vi.GetMaxIndex
c = vi.Next
c = vi.Next

End Sub


Вернуться в «ПО для наших нужд»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей

cron