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

my  $ldap = Net::LDAP->new('192.168.7.36', port => 62222, version => 3) or die "$@";#получение контекста соединения с сервером по Ldap протоколу
my  $mesg = $ldap->bind(dn => 't=R');#обращение к хранилтщу R в скобках писать обязательно надо писать t=R
$mesg = $ldap->search(base => "", scope => 'sub', filter => "(certificateRevocationList=*)");#Поиск списка отозванных сертификатов по Ldap дереву по указанным атрибутам и фильтру
$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') #если это атрибут 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)
                }
            }
        }
    }
}