#!/usr/bin/perl
#----------------------------------------------------------------------
#
# printLdapCert.pl v: 20050601-01
#
# Program to print a certificaty stored in LDAP directory
#
# Params:
#
# a = DN entry
# h = LDAP server
# p = port
#
# Example:
# printLdapCert.pl?a=uid=masa,dc=rediris,dc=es&h=ldap.rediris.es&p=1389
# printLdapCert.pl?a=cn=henny,ou=Accounts,ou=Office,dc=SURFnet,dc=NL&h=alpha.surfnet.nl&p=389
#
#----------------------------------------------------------------------
use Net::LDAP;
use Net::LDAP::Search;
use CGI::Lite;
$cgi = new CGI::Lite;
%webData = $cgi->parse_form_data;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Ini: Configuracion / Config
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#-- LDAP data
$ldapDef{'server'} = "ldap.rediris.es";
$ldapDef{'port'} = "1389";
$webStrings{'serverProblem'} = '"El servidor $wServer tiene un problema. No podemos
contactar con él.
Server $wServer has a problem. We can contact it"';
$webStrings{'noParam'} = '"Se ha producido un error al llamar al script.
No se ha introducido parametros al llamar al script.
Revisa el codigo de la pagina Web
There is an error. You need to provide parameter a=DN"';
$cgi{'openssl'} = "/usr/local/bin/openssl";
$tempFile = "/tmp/kk1";
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# End: Configuracion / Config
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# print Header
print "Content-type: text/html\n\n";
if (defined $webData{a})
{
$wBase = $webData{a};
$wServer = defined ($webData{h}) ? $webData{h} : $ldapDef{'server'};
$wPort = defined ($webData{p}) ? $webData{p} : $ldapDef{'port'};
$attr = "userCertificate";
$pLDAP = Net::LDAP->new ($wServer, port => $wPort, timeout => 10, async => 1,);
if (defined $pLDAP){
$pLDAP->bind ( anonymous => 1, version => 3 );
$rdo = $pLDAP->search (base => $wBase, scope => "base", filter => "(c=tv)",);
#-- Comprobamos si hay algun error como:
# que el servidor tenga version 2
my $err = $rdo->error;
if ($err ne "Success"){
$pLDAP->unbind;
if ($err eq "Protocol Error"){ $pLDAP->bind ( anonymous => 1, version => 2 ); }
else { print eval $webStrings{'serverProblem'}; }
}
# Obtenemos el atributo que nos interesa
$rdo = $pLDAP->search (base => $wBase, scope => "base",filter => "(objectclass=*)", attrs => [ $attr ],);
# Como es binario obtenemos el valor del atributo
$der = ObtieneDER ($rdo->entry(0),$attr);
# Lo meto en un archivo porque sino el openssl no lo entiende
open REQUEST, ">$tempFile";
print REQUEST "$der";
close REQUEST;
$wTitle = "Certificate for $wBase";
$wCert = `$cgi{'openssl'} x509 -inform DER -in $tempFile -text -noout`;
$OUTPUT .= "$wTitle
";
$OUTPUT .= "$wCert
";
print $OUTPUT;
unlink <$tempFile>;
$pLDAP->unbind;
}
else
{
print eval $webStrings{'serverProblem'};
exit;
}
}
# No me han metido los parametros requeridos
else
{
print eval $webStrings{'noParam'};
exit;
}
#-----------------------------------------------------------------------
# Funcion: ObtieneDER
# Descrip:
#-----------------------------------------------------------------------
sub ObtieneDER{
local($entry,$attr)= @_;
my $archivo;
my @value = $entry->get_value( $attr.";binary" );
foreach my $value (@value)
{
$archivo = $archivo.$value;
}
return $archivo;
}