#!/usr/bin/perl
#Пример иллюстрирует работу с хранилищем по протоколу Ldap, расширенный поиск списка  отозванных сертификатов(CRL) в указанном хранилище.
use Net::LDAP;#Пакет необходимый для работы с LDAP. В стандартные пакеты Perl не входит.
use strict;

my  $ldap = Net::LDAP->new('192.168.7.36', port => 62222, version => 3) or die "$@";
my  $mesg = $ldap->bind(dn => 't=L');#обращение к хранилтщу L (по умолчанию) в скобках писать не обязательно t=L
$mesg = $ldap->search(base => "", scope => 'sub', filter => "(&(ucertificateRevocationList=*)(cn=USER00001))");
# Фильтр для поиска. Можно натсроить поиск конкретно по отдельным атрибутам. В данном случае  (&(userCertificate=*)(cn=USER00001))  мы ищим CRL у которых атрибут cn=USER00001
#Также можно задавать поиск не вводя полного значения например (&(userTemplate=*)(mail=d_*)). Этот фильтр будет искать все шаблоны  у которых  mail=d_.
$mesg->code && die $mesg->error;   #Проверка на наличие ошибок
my $max = $mesg->count;
printf("Count crl: %d\n",$max);
for(my $index = 0 ; $index < $max ; $index++)  # проход по веткам
{
    my $entry = $mesg->entry($index);
    my $dn = $entry->dn;
    print $dn . "\n";
    my @attrs = $entry->attributes; # Получить атрибуты  ветки
    foreach my $var (@attrs) #проход по атрибутам ветки
    {
        my $attr = $entry->get_value($var, asref =>1); #получение атрибутов атрибута
        if( defined($attr) )
        {
            foreach my $value ( @$attr )  #проход по   атрибутам атрибута
            {
                if($var eq 'certificateRevocationList')
                {
                    my $res=$ldap->extension(name => '1.3.6.1.4.1.6801.11.1.4', value => $value);
                    #отправка $var на службу  1.3.6.1.4.1.6801.11.1.4 (Verify)
                    #Вместо строки 1.3.6.1.4.1.6801.11.1.4 можно ввести любую службу, например 1.3.6.1.4.1.6801.11.1.10(RA)  или  1.3.6.1.4.1.6801.11.1.0 (Echo)
                }
            }
        }
    }
}