Paul,

Check the permsissions ownership of your certificates and the directory
containing them. Also check that there are no typos in your capath.

I'm using start_tls without a problem. Here's an example of my code in a
subroutine.

Since I don't know if the server(s) in @servers are
ldap://host.example.com or ldaps://host.example.com, I check the scheme
and then start_tls if the server is of the form ldap://host.example.com.

Prentice

sub ldap_connect
{
    my $description = $_[0];
    my $cacertfile = $_[1];
    my $debug = $_[2];
    my @servers = $_[3];

    my $ldap;
    my $mesg;
    my $scheme;
    my $code;
    my $error;

    if ($debug) {
        print "Connecting to $description\n";
    }

    $ldap = Net::LDAP->new(@servers);
    if ($ldap) {
        if ($debug) {
            print "Connected to $description\n";
        }
        $scheme = $ldap->scheme;
        # If scheme != 'ldaps', Start TLS. Fail if we can't.
        if ($scheme ne 'ldaps') {
            $mesg = $ldap->start_tls(verify=>'require',
                                     cafile => $cacertfile);
            $code = $mesg->code;
            if ($code == 0) {
                if ($debug) {
                    print "Started TLS on $description\n";
                }
            } else {
                $error = $mesg->error;
                print "$error\n";
                print "Error: Could not start TLS for $description\n";
                $ldap->unbind;
                return(undef);
            }
        } else {
            if ($debug) {
                print "TLS already started for $description\n";
            }
        }
        return($ldap);
    } else {
        print "Error: Could not connect to $description\n";
        return(undef);
    }
}


Paul Liu wrote:
> Hi, thanks for the info. I still have the same error with LDAPS instead of 
> TLS. The behaviour is the same too, it works if I don't require verification, 
> but fails if I do.
> 
> -----Original Message-----
> From: Dieter Kluenter [mailto:die...@dkluenter.de] 
> Sent: July-13-10 2:38 AM
> To: perl-ldap@perl.org
> Subject: Re: Having trouble with TLS and server verification
> 
> Paul Liu <paul_...@kanetix.ca> writes:
> 
>> Hi,
>>
>> I'm trying to use Net::LDAP to do LDAPS authentication against my Server 
>> 2008 Active Directory and I'm having a hard time getting server verification 
>> to work.
>>
>> So far, my (super simple) code works if I use verify => none in start_tls, 
>> but as soon as I set it to "require" or "optional", I get this error:
>>
>> SSL connect attempt failed with unknown error error:0D0C50A1:asn1 encoding 
>> routines:ASN1_item_verify:unknown message digest algorithm at ./ldap.pl line 
>> 23, line 522.
>>
>> When I test from the command line using Openssl s_client it works okay, so I 
>> don't think it's an OpenSSL problem. But I'm kind of a noob with Perl, so 
>> I'm not sure what else to debug next.
>>
>> Here's the relevant code snippet:
>>
>> #!/usr/bin/perl
>> use Net::LDAP;
>>
>> $ldap = Net::LDAP->new('ho.mydomain.com',
>>                         ) or die "LDAP error";
>> $mesg = $ldap->start_tls(
>>     sslversion => 'tlsv1',
>>     verify => 'require',
>>     capath => '/etc/ssl/certs/',
>>     );
>> die $mesg->error if $mesg->is_error;
>>
>> All the certs in the chain are signed with SHA512RSA. Also the CA Cert is 
>> 4096 bits and the server certs I am checking are all 2048 bits. I thought I 
>> might be missing a module or something, but I am pretty sure I have all the 
>> prerequisites installed, including Digest::SHA, Digest::HMAC and 
>> IO::Socket::SSL. I'm kind of stuck. Has anyone ever had this problem before? 
>> I'm working with Perl 5.10 on SLES 11 SP1. My OpenSSL version is 0.9.8h.
> 
> start_tls is an extended operation on port 389 and ldap uri, use port
> 636 and ldaps uri.
> 
> -Dieter
> 

-- 
Prentice Bisbal
Linux Software Support Specialist/System Administrator
School of Natural Sciences
Institute for Advanced Study
Princeton, NJ

Reply via email to