#!/usr/bin/perl #---------------------------------------------------------------------- # # pinta_de_LDAP.pl v1.0.0 # # Script que se conecta con el directorio LDAP y te devuelve una CRL o, # un certificado, pintandolo en pantalla # # OJO: está preparado para que la salida la de en formato webber. # # Recibe tres parametros: # a = entrada en la que queremos buscar # b = atributo que queremos mostrar # c = directorio base # # Forma de llamar al script: # pinta_de_LDAP.pl?a=cn%3DRedIRIS-PCA%2Cdc%3Drediris%2Cdc%3Des&b=certificateRevocationList&c=rediris-pca # #---------------------------------------------------------------------- use Net::LDAP; use Net::LDAP::Search; use CGI::Lite; $cgi=new CGI::Lite; %datos=$cgi->parse_form_data; $openssl="/usr/local/bin/openssl"; $file="/var/spool/rediris-ca-request/.entrada"; if (!defined $datos{c}){ $datos{c}="rediris-ca"; } $webber = "/usr/local/bin/webber -t /home/spool/WWW/html/$datos{c}/.template-cgi"; $|=1; # Pinto la cabecera print "Content-type: text/html\n\n"; # Pinto el titulo de la pagina open (OUTPUT,"|$webber"); print OUTPUT "#wbbIn=\n"; # Compruebo que me han metido los dos parametros requeridos if (defined $datos{a} && defined $datos{b}) { $wBase = $datos{a}; $wServer = "DIR_SERVIDOR_LDAP"; $wPort= "389"; $atributo=$datos{b}; $base=$datos{c}; $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 OUTPUT "No podemos contactar con el servidor $wServer."; exit; } } # Obtenemos el atributo que nos interesa $rdo = $pLDAP->search (base => $wBase, scope => "base",filter => "(objectclass=*)", attrs => [ $atributo ],); # Como es binario obtenemos el valor del atributo $der=ObtieneDER ($rdo->entry(0),$atributo); # Lo meto en un archivo porque sino el openssl no lo entiende open REQUEST, ">$file"; print REQUEST "$der"; close REQUEST; ### # Me solicitan una CRL if ($atributo eq "certificateRevocationList") { print OUTPUT "

Descarga: [PEM] [DER] [ASCII]

"; $titulo="Lista de Certificados Revocados (CRL) en vigor"; $salida=`$openssl crl -inform DER -in $file -text -noout`; } # Me solicitan otra cosa, o sea, un certificado else { print OUTPUT "

Descarga: [Repositorio]

"; $titulo="Certificado en vigor de $wBase"; $salida=`$openssl x509 -inform DER -in $file -text -noout`; } # Pinto una pequeña tabla para ponerlo bonito print OUTPUT "
 
 $titulo
 
"; print OUTPUT "
";
    print OUTPUT $salida;
    print OUTPUT "
"; unlink <$file>; # Me desconecto del server $pLDAP->unbind; } else { print OUTPUT "El servidor $wServer tiene un problema. No podemos contactar"; exit; } } # No me han metido los parametros requeridos else { print OUTPUT "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"; exit; } #----------------------------------------------------------------------- # Funcion: ObtieneDER # Descrip: #----------------------------------------------------------------------- sub ObtieneDER{ local($entry,$attr)= @_; #my $entry = shift; #my @attrs = $entry->attributes; my $archivo; #foreach my $attr (@attrs){ my @value = $entry->get_value( $attr.";binary" ); foreach my $value (@value) { $archivo=$archivo.$value; } #} return $archivo; }