Well, using the lda-utils.lib you attached below gives the exact same results.
On Thu, Aug 09, 2001 at 02:42:35PM +0200, Michael Bell wrote:
> Dave Botsch wrote:
> > Netscape Communicator, however, insists there are no such certificates.
> >Is it expecting something different in terms of the certificate format
> >or in terms of the DN of the certificate? This is when I go to Security,
> >People, Search Directory.
> >
> > I am a bit suspicious as when viewing my ldap entry in Netscape, the
> >usercertificate field shows the binary garbage in ascii representation.
>
> That's definitly wrong! I attach an actual version of the ldap-utils.lib
> which much be present in cgi-raserver/lib/ldap-utils.lib. The certs must
> be stored as DER. The browser interprets the attribute userCertificate
> and shows some data of the certificate.
>
> Cheers,
>
> Michael
> --
> ----------------------------------------------------------------------------
> Michael Bell Email: [EMAIL PROTECTED]
> Rechenzentrum - Datacenter Email (work):
> [EMAIL PROTECTED]
> Humboldt-University of Berlin Tel.(work): +49 (0)30-2093 2482
> Unter den Linden 6 Fax.(work): +49 (0)30-2093 2959
> 10099 Berlin
> Germany [OpenCA Core
> Developer]
>
> http://openca.sourceforge.net
> #!/usr/bin/perl
>
> ## RA Server Management Utility
> ## (c) 1999 by Massimiliano Pala
> ## All Rights Reserved
> ##
> ## Project Information:
> ##
> ## Current Version ..................... $VER
> ## Project Started on .................. 17/12/1998
> ## Last Modified on .................... 30/03/2001
> ## Project Closed on ................... n/a
> ##
> ## Program currently tested with OpenLDAP v.1.2 on Linux, Solaris
> ## and Sleepycat DB.
> ##
> ## DISC CLAIMER: THIS SOFTWARE IS GIVEN AS IS WITHOUT ANY WARRANTIES
> ## ABOUT ANY DAMAGE DERIVED BY THE USE ( CORRECT OR NOT ) OF THIS
> ## SOFTWARE. THE AUTHOR IS THEREFORE NOT RESPONSABLE IN ANY WAY OF
> ## DAMAGES RELATED IN ANY WAY TO THIS OR SUPPORTED SOFTWARE AS WELL.
> ##
> ## If you want to contact me (the author) please use the e-mail
> ## addresses listed below. Do not esitate in reporting bugs, enhancement
> ## or anything seems useful in developing this software:
> ##
> ## [EMAIL PROTECTED]
> ## [EMAIL PROTECTED]
> ## [EMAIL PROTECTED]
> ##
>
> ## Thank you for using this software, and remember that Open Projects
> ## are the future of mankind. Do not sleep, partecipate to world wide
> ## efforts to make life easier for all!
>
> sub addCertsUsers {
> my @keys = @_;
>
> ## Reserved Variables
> my ( @certsList );
> my ( $filename, $tmp, $ID, $cert, $ldap, $ret );
>
> ## Get Required parameter
> my $serverDir = getRequired( 'ServerDir' );
>
> ## Debugging info
> my $DEBUG = 0;
>
> ## This file has the latest imported certificate's serials
> $filename = "$serverDir/stuff/lastImport.txt";
>
> ## Let's open the stuff/lastImport.txt
> if( not -e "$filename" ) {
> configError( "File $filename not found!");
> }
>
> $tmp = $query->getFile( "$filename");
>
> if( $tmp eq "" ) {
> success( "Last Import file was empty.");
> }
>
> my @certsList = split( "\n", $tmp );
>
> my $table = $query->buildRefs ( ELEMENTS =>, MAXITEMS =>);
> my $table .= $query->startTable (COLS=>[ "Cert.-No.",
> "DN",
> "adding dn",
> "adding certificate" ],
> WIDTH=>"100%",
> TITLE_BGCOLOR=>"#DDCCFF");
>
> foreach $ID (@certsList) {
>
> my @line = ();
>
> my ( $filter, $serID, $parsed, $ret, $entry );
> ( $serID ) = ( $ID =~ /([a-f0-9]+)/i );
>
> ## Let's be sure it is in the right format
> $serID = uc( $serID );
> $serID = "0$serID" if( length($serID) % 2 );
>
> my $cert = $db->getItem ( DATATYPE => VALID_CERTIFICATE,
> KEY => $serID );
>
> if( not $cert ) {
> $table .= $query->addTableLine( DATA => [
> "<FONT COLOR=\"Red\">".
> "ERROR [$serID] : can't get certificate" .
> " from dB!\n</FONT>" ] );
> next;
> }
>
> $parsed = $cert->getParsed();
>
> push ( @line, $serID, $parsed->{DN});
> $ret = addLDAPobject ( CERTIFICATE=>$cert );
>
> my $text;
> $text .= "<FONT COLOR=\"Red\">" if ( not $ret->{STATUS} );
> $text .= $ret->{DESC};
> $text .= "</FONT>" if ( not $ret->{STATUS} );
> push ( @line, $text);
>
> if( $ret->{STATUS} ) {
> $ret = addLDAPattribute ( CERTIFICATE => $cert , NOPRINT => true);
>
> if ($ret->{STATUS}) {
> push (@line, "success");
> } else {
> push (@line, "Error : ".$ret->{CODE});
> }
> } else {
> push (@line, "operation not performed");
> }
>
> $table .= $query->addTableLine ( DATA => [ @line ]);
>
> }
>
> $table .= $query->endTable;
> print $table;
>
> return "Ok.";
> }
>
> sub addLDAPobject {
>
> ######################################################
> ## only certs makes sense because a CRL can only be ##
> ## produced if a valid CA-cert exists ##
> ######################################################
>
> my $keys = { @_ };
> local ( $obj, $parsed, $serID, $ldap, $ret, $dn, $cn, $sn, $email );
>
> my $DEBUG = 0;
>
> ## check the type of the attribute
> $obj = $keys->{CERTIFICATE};
> return if ( not $obj );
>
> ## get the needed data
> my $cert_dn = $obj->getParsed ()->{DN};
> my $cert_cn = $obj->getParsed ()->{CN};
> my $cert_serID = $obj->getParsed ()->{SERIAL};
> my $cert_email = $obj->getParsed ()->{EMAIL};
> my $cert_ou = $obj->getParsed ()->{OU};
> my $cert_o = $obj->getParsed ()->{O};
> my $cert_l = $obj->getParsed ()->{L};
> my $cert_st = $obj->getParsed ()->{ST};
>
> ## debugging
> print "Information of the Object:<br>\n" if ($DEBUG);
> print "dn ".$cert_dn."<br>\n" if ($DEBUG);
> print "cn ".$cert_cn."<br>\n" if ($DEBUG);
> print "serID ".$cert_serID."<br>\n" if ($DEBUG);
> print "email ".$cert_email."<br>\n" if ($DEBUG);
> print "ou ".$cert_ou."<br>\n" if ($DEBUG);
> print "o ".$cert_o."<br>\n" if ($DEBUG);
> print "l ".$cert_l."<br>\n" if ($DEBUG);
> print "st ".$cert_st."<br>\n" if ($DEBUG);
> print "End of the information of the Object.<br>\n" if ($DEBUG);
>
> ## here we could perform some operations with the data
> ## sn is not the real sn sometimes but you can find
> ## the person via a search with a wildcard
> my $cert_sn = $cert_cn;
> $cert_sn =~ s/^[^ ]* //;
> my $ou_counter = 0;
> my @ou_array = ();
>
> ## Get the Connection to the Server
> if ( not ( $ldap = LDAP_connect() )) {
> print "<FONT COLOR=\"Red\">";
> print "LDAP [$serID]: Connection Refused by server!\n";
> print "</FONT><BR>\n";
>
> return;
> };
>
> ## Let's bind for a predetermined User
> $ret = LDAP_bind( LDAP => $ldap );
> if( not $ret->{STATUS} ) {
> print "Failed in Bind: " . $ret->{CODE} . "\n";
> LDAP_disconnect( LDAP => $ldap );
> return $ret->{CODE};
> };
>
> ## build the array from the LDAP root
> my $basedn = getRequired ('basedn');
> my @basedn_array = ();
> my $h_attribute;
> while ($basedn) {
> ## get the last element
> $h_attribute = $basedn;
> $basedn =~ s/^[^,]*,//;
> $h_attribute = substr ($h_attribute,
> 0,
> length ($h_attribute) - length ($basedn));
> if ( not $h_attribute ) {
> $h_attribute = $basedn;
> $basedn = "";
> }
> $h_attribute =~ s/,//;
> $h_attribute =~ s/(^ )|( $)//g;
> print "element of baseDN: ".$h_attribute."<br>\n" if ($DEBUG);
> if ($h_attribute =~ /^\s*ou\s*=.*$/i) {
> $ou_array [$ou_counter] = $h_attribute;
> $ou_array [$ou_counter] =~ s/^\s*ou\s*=\s*//i;
> $ou_counter++;
> }
> push (@basedn_array, $h_attribute);
> }
>
> ## build the array from the DN
> my $h_dn = $cert_dn;
> my @dn_array = ();
> my $h_attribute;
> while ($h_dn) {
> ## get the last element
> $h_attribute = $h_dn;
> $h_dn =~ s/^[^\/,]*\///;
> $h_attribute = substr ($h_attribute,
> 0,
> length ($h_attribute) - length ($h_dn));
> if ( not $h_attribute ) {
> $h_attribute = $h_dn;
> $h_dn = "";
> }
> $h_attribute =~ s/\///;
> $h_attribute =~ s/(^ )|( $)//g;
> print "element of the inserted DN: ".$h_attribute."<br>\n" if ($DEBUG);
> push (@dn_array, $h_attribute);
> }
>
> ## verify that the root in the DN is ok
> print "Checking RootDN of Certificate ...<br>\n" if ($DEBUG);
> print "Inserted DN\t\t\tBaseDN<br>\n" if ($DEBUG);
> while (scalar (@basedn_array) and scalar (@dn_array)) {
> my $h_basedn = pop (@basedn_array);
> my $h_dn = pop (@dn_array);
> print $h_dn."\t\t".$h_basedn."<br>\n" if ($DEBUG);
> ## this dn cannot be added under the root-dn
> if ( (uc $h_basedn) ne (uc $h_dn) ) {
> LDAP_disconnect ( $ldap );
> return { STATUS => 0 ,
> DESC => "Error ( dn conflicts with basedn )",
> CODE => -1 };
> }
> }
> ## dn which should be inserted is shorter then the root-dn
> print "Checking the length of the DN of the Certificate ...<br>\n" if ($DEBUG);
> if ( scalar (@basedn_array) ) {
> LDAP_disconnect ( $ldap );
> return { STATUS => 0 ,
> DESC => "Error ( dn is shorter then basedn )",
> CODE => -2 };
> }
> ## if dn == basedn then their is no error because this can
> ## be the CA-dn
> return { STATUS => 1, CODE => 0, DESC => "Success" }
> if (!scalar (@dn_array));
>
> ## setup the tree for the DN
> ## attention only the last ldapadd must be successful !!!
> print "Building the missing nodes of the LDAP-tree ...<br>\n" if ($DEBUG);
> my $add_dn = getRequired ('basedn');
> my $actual_element;
> my $use_ldap_add = 0;
> while (scalar (@dn_array)) {
> $actual_element = pop @dn_array;
> if ($actual_element =~ /^\s*ou\s*=.*$/i) {
> $ou_array [$ou_counter] = $actual_element;
> $ou_array [$ou_counter] =~ s/^\s*ou\s*=\s*//i;
> $ou_counter++;
> }
>
> ## prepare the needed strings
> $add_dn = $actual_element.",".$add_dn;
> print "Try to add $add_dn ...<br>\n" if ($DEBUG);
>
> ## check that the entry not exist in the LDAP-tree
> my $base = $add_dn;
> #$base =~ s/^[^,]*,//;
> my $search_filter = $add_dn;
> $search_filter =~ s/,.*$//g;
> $search_filter =~ s/^email=/mail=/i;
> $search_filter = "(".$search_filter.")";
> print "LDAP Searchfilter: ".$search_filter."<br>\n" if ($DEBUG);
> print "LDAP Base: ".$base."<br>\n" if ($DEBUG);
> my $ldap_search_mesg = $ldap->search (
> base => $base,
> scope => "sub",
> filter => $search_filter);
> print "LDAP Search Mesg-Code ".$ldap_search_mesg->code."<br>\n" if ($DEBUG);
> print "LDAP Search Mesg-Count ".$ldap_search_mesg->count."<br>\n" if ($DEBUG);
> ## I stop the insertion because of a searcherror too
> if ( not $ldap_search_mesg or
> #$ldap_search_mesg->code or
> $ldap_search_mesg->count) {
> ## node/leaf exists
> print "node exists<br>\n" if ($DEBUG);
> next;
> }
> $use_ldap_add = 1;
>
> ## insert the different types
> ## attention: I don't insert here a CA!!!
> ## this most be done otherwise because I cannot declare
> ## any o and ou to be a (sub)CA
> my @attr;
> if ($add_dn =~ /^\s*(cn|email|serialNumber)\s*=.*$/i) {
> return undef if (not $cert_sn or not $cert_cn);
> push @attr, 'cn' => $cert_cn;
> push @attr, 'sn' => $cert_sn;
> push @attr, 'objectclass' => [ 'top',
> 'person',
> 'organizationalPerson',
> 'inetOrgPerson'
> ];
> push @attr, 'ou' => [ @ou_array ] if (scalar @ou_array);
> push @attr, 'o' => $cert_o if ($cert_o);
> push @attr, 'mail' => $cert_email if ($cert_email);
> push @attr, 'st' => $cert_st if ($cert_st and $add_dn =~ /\s*st\s*=/i);
> push @attr, 'l' => $cert_l if ($cert_l and $add_dn =~ /\s*l\s*=/i);
> } elsif ($add_dn =~ /^\s*ou\s*=.*$/i) {
> return undef if (not scalar @ou_array);
> push @attr, 'ou' => [ @ou_array ];
> push @attr, 'authorityRevocationList;binary' => '';
> push @attr, 'certificateRevocationList;binary' => '';
> push @attr, 'cACertificate;binary' => '';
> push @attr, 'objectclass' => [ 'top',
> 'organizationalUnit',
> 'certificationAuthority'
> ];
> push @attr, 'st' => $cert_st if ($cert_st and $add_dn =~ /\s*st\s*=/i);
> push @attr, 'l' => $cert_l if ($cert_l and $add_dn =~ /\s*l\s*=/i);
> } elsif ($add_dn =~ /^\s*o\s*=.*$/i) {
> return undef if (not $cert_o);
> push @attr, 'o' => $cert_o;
> push @attr, 'authorityRevocationList;binary' => '';
> push @attr, 'certificateRevocationList;binary' => '';
> push @attr, 'cACertificate;binary' => '';
> push @attr, 'objectclass' => [ 'top',
> 'organization',
> 'certificationAuthority'
> ];
> push @attr, 'st' => $cert_st if ($cert_st and $add_dn =~ /\s*st\s*=/i);
> push @attr, 'l' => $cert_l if ($cert_l and $add_dn =~ /\s*l\s*=/i);
> } elsif ($add_dn =~ /^\s*c\s*=.*$/i) {
> return undef if (not $cert_c);
> push @attr, 'c' => $cert_c;
> push @attr, 'objectclass' => [ 'top',
> 'country'
> ];
> } elsif ($type =~ /^st$/i) {
> return undef if (not $cert_st);
> push @attr, 'st' => $cert_st;
> push @attr, 'objectclass' => [ 'top',
> 'locality'
> ];
> } elsif ($type =~ /^l$/i) {
> return undef if (not $cert_l);
> push @attr, 'st' => $cert_l;
> push @attr, 'objectclass' => [ 'top',
> 'locality'
> ];
> } else {
> return undef;
> }
>
> print "Attributes for the insertion:<br>\n" if ($DEBUG);
> foreach $h (keys %{$attr}) {
> print "$h = $attr->{$h}<br>\n" if ($DEBUG);
> }
>
> $ldapadd_result = $ldap->add ( $add_dn , attr => [ @attr ] );
> print "The resultcode of the nodeinsertion was ".
> $ldapadd_result->code.".<br>\n" if ($DEBUG);
> last if ($ldapadd_result->code);
> }
>
> if ($use_ldap_add) {
> if( $ldapadd_result->code ) {
> ## print "<FONT COLOR=\"Red\">";
> ## print "Error Adding DN [$serID]: " . $ldapadd_result->code ."<BR>\n";
> ## print "</FONT>";
> LDAP_disconnect ( $ldap );
> return { STATUS => 0 ,
> DESC => "Error ( code " .
> $ldapadd_result->code . " )",
> CODE => $ldapadd_result->code };
> }
> }
>
> LDAP_disconnect ( $ldap );
> return { STATUS => 1, CODE => 0, DESC => "Success" };
> }
>
> ## this function add certificates and CRLs to the directory
> sub addLDAPattribute {
> my $keys = { @_ };
> my $obj;
> local $ret;
> my $ldap;
> my $noprint;
> my $dn;
> my $attr;
>
> my $DEBUG = 0;
>
> ## check the type of the attribute
> if ( $keys->{CERTIFICATE} ) {
> $obj = $keys->{CERTIFICATE};
> $attr = "userCertificate";
> } elsif ( $keys->{AUTHORITY_CERTIFICATE} ) {
> $obj = $keys->{AUTHORITY_CERTIFICATE};
> $attr = "cACertificate";
> } elsif ( $keys->{CRL} ) {
> $obj = $keys->{CRL};
> $attr = "certificateRevocationList";
> } elsif ( $keys->{AUTHORITY_CRL} ) {
> $obj = $keys->{AUTHORITY_CRL};
> $attr = "authorityRevocationList";
> }
> $attr .= ";binary";
> return if ( not $obj );
>
> ## set output mode
> $noprint = $keys->{NOPRINT};
> $noprint = 0 if ($DEBUG);
>
> ## Initializing Connection to LDAP Server
> if ( not ( $ldap = LDAP_connect() )) {
> return;
> }
>
> ## Let's bind for a predetermined User
> $ret = LDAP_bind( LDAP => $ldap );
> if ( not $ret->{STATUS} ) {
> LDAP_disconnect ( LDAP => $ldap );
> return;
> }
>
> ## get dn
> if ( $attr =~ /CERTIFICATE/i ) {
> $dn = $obj->getParsed()->{DN};
> } elsif ( $type =~ /revocationList/i ) {
> $dn = $obj->getParsed()->{ISSUER};
> }
> $dn =~ s/\//,/g;
> $dn =~ s/^ *,* *//g;
> ## fix problems with big letters
> $dn =~ s/email=/email=/i;
> $dn =~ s/cn=/cn=/i;
> $dn =~ s/c=/c=/i;
> $dn =~ s/ou=/ou=/i;
> $dn =~ s/o=/o=/i;
> $dn =~ s/st=/st=/i;
> $dn =~ s/l=/l=/i;
>
> ## $serID = $cert->getParsed()->{SERIAL};
> print "addLDAPattribute: DN= ".$dn."<br>\n" if ($DEBUG);
> print "attr: ".$attr."<br>\n" if ($DEBUG);
>
> ## search the attribute
> my $search_filter = $dn;
> $search_filter =~ s/,.*$//g;
> $search_filter =~ s/^email=/mail=/i;
> $search_filter = "(".$search_filter.")";
> print "LDAP Searchfilter: ".$search_filter."<br>\n" if ($DEBUG);
> my $mesg = $ldap->search (
> base => $dn,
> scope => "base",
> filter => $search_filter);
> print "LDAP Search Mesg-Code ".$mesg->code."<br>\n" if ($DEBUG);
> print "LDAP Search Mesg-Count ".$mesg->count."<br>\n" if ($DEBUG);
>
> ## I stop the insertion because of a searcherror too
> if ( not $mesg or
> $mesg->code or
> not $mesg->count) {
> ## search failed
> if (!$noprint) {
> print "Search for the attribute failed.\n";
> }
> if ($mesg) {
> $code = $mesg->code;
> } else {
> $code = 1;
> }
> LDAP_disconnect( LDAP => $ldap );
> return { STATUS => 0 , CODE => $code };
> }
>
> ## we can get only one entry because scope is set to "base"a
>
> ## load values
> my @values = $mesg->entry (0)->get_value ( $attr);
> push @values, $obj->getDER();
>
> ## remove doubles
> @values = sort @values;
> for (my $i=1; $i < scalar @values; $i++) {
> if ($values[$i] eq $values[$i-1]) {
> splice @values, $i;
> $i--;
> }
> }
>
> ## insert into ldap
>
> $mesg = $ldap->modify ($dn, replace => {$attr => [ @values ]});
>
> if( $mesg->code ) {
>
> $txt = "Unknown Error ( " . $mesg->code . " )";
>
> if (!$noprint) {
> print "$txt\n";
> }
> LDAP_disconnect( LDAP => $ldap );
> return { STATUS => 0 , CODE => $mesg->code };
> } else {
> $txt = "Attribute successfully inserted."
> }
>
> LDAP_disconnect( LDAP => $ldap );
> if (!$noprint) {
> # print "LDAP Result [$serID]: Success ( " . $mesg->code ." )<BR>\n";
> print "Success (".$txt.")\n";
> }
> return { STATUS => 1,
> DESC => "Success (".$txt.")",
> CODE => 0 };
> }
>
> sub LDAPsearch {
>
> my $keys = { @_ };
> my ( $mseg, $ldap, $limit, $ldapBase, $serID, $filter, $ret );
>
> $filter = $keys->{FILTER};
> $serID = $keys->{SERIAL};
>
> return if ( not $filter );
>
> ## Get required configuration keys
> $ldapBase = getRequired( 'basedn' );
>
> ## Initializing Connection to LDAP Server
> if ( not ( $ldap = LDAP_connect() )) {
> print "<FONT COLOR=\"Red\">";
> print "LDAP [$serID]: Connection Refused by server!\n";
> print "</FONT><BR>\n";
>
> return;
> };
>
> ## Let's bind for a predetermined User
> $ret = LDAP_bind( LDAP => $ldap );
> if( not $ret->{STATUS} ) {
> print "Failed in Bind: " . $ret->{CODE} . "\n";
> LDAP_disconnect( LDAP => $ldap );
> return $ret->{CODE};
> };
>
> $mesg = $ldap->search ( base => "$ldapBase",
> filter => "$filter" );
>
> if ( $mesg->code ) {
> LDAP_disconnect( LDAP => $ldap );
> return;
> }
>
> return { COUNT => $mesg->count, ENTRIES => $mesg->entries };
> };
>
>
> sub LDAP_connect {
>
> my $keys = { @_ };
> my ( $ldap, $ldapSrv, $port, $ldapUsr, $ldapBase, $ldaplim,
> $ldapPwd, $filter, @attrs, $ret );
>
> ## Initializing Connection to LDAP Server
> $ldapSrv = getRequired( 'ldapserver' );
>
> $port = getRequired('ldapport');
> $ldaplim = getRequired('ldaplimit');
>
> ## if no initialization found, get defaults
> $port = 389 unless $LDAP_Port;
>
> ## Get the Connection to the Server
> $ldap = Net::LDAP->new ("$ldapSrv",
> port => "$port",
> async => 0 );
>
> return if( not $ldap );
>
> return $ldap;
>
> }
>
> sub LDAP_disconnect {
>
> $keys => {@_};
>
> my $ldap = $keys->{LDAP};
>
> return {STATUS => 0 } if ( not $ldap );
> $ldap->unbind;
>
> return {STATUS => 1};
> }
>
> sub LDAP_bind {
>
> my $keys = {@_};
>
> ## Get Required Parameters
> my $ldapUsr = getRequired('ldaproot');
> my $ldapPwd = getRequired('ldappwd');
>
> ## Get ldap passed ref
> my $ldap = $keys->{LDAP};
>
> ## Return if no object passed
> return if( not $ldap );
>
> ## Try to bind to selected user
> my $mesg = $ldap->bind( "$ldapUsr",
> 'password' => "$ldapPwd" );
>
> ## if got an error, return it
> if ( $mesg->code ) {
> LDAP_disconnect( LDAP => $ldap );
> return { STATUS => 0, CODE => $mesg->code };
> };
>
> return { STATUS => 1 };
> }
>
> 1;
>
> ___END___;
>
--
********************************
David William Botsch
[EMAIL PROTECTED]
********************************
_______________________________________________
Openca-Users mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/openca-users