Hello list. I'm currently working on a test suite for Fusioninventory Agent (http://fusioninventory.org/wordpress). Part of the test suite checks the ability of the agent to communicate with its server through HTTP, using LWP. I'm using a minimalist test server, using HTTP::Server::Simple. It works fine for http or https connection, however I can't succeed having LWP bails out when a non-trusted certificate is used, despite using Crypt::SSLeay and setting $ENV{HTTPS_CA_FILE}.
The attached test case shows the issue, using a self-signed certificate:
perl test.pl crt/bad.pem key/bad.pem crt/ca.pem
Even more strange, even setting $ENV{HTTPS_DEBUG} doesn't even bring
additional output :(
The sample code at
http://stackoverflow.com/questions/74358/how-can-i-get-lwp-to-validate-ssl-server-certificates,
using an actual apache web server, works fine, so I guess the problem
probably comes from my testing setup.
Thanks for your suggestions.
--
BOFH excuse #204:
Just pick up the phone and give modem connect sounds. "Well you said we
should get more lines so we don't have voice lines."
#!/usr/bin/perl
package Server;
use warnings;
use strict;
use base qw(HTTP::Server::Simple::CGI);
use IO::Socket::SSL;
sub new {
my ($class, $crt, $key) = @_;
my $self = $class->SUPER::new(8080);
$self->{crt} = $crt;
$self->{key} = $key;
return $self;
}
sub run {
my $self = shift;
$self->{pid} = $self->SUPER::run(@_);
$SIG{__DIE__} = \&stop;
return $self->{pid};
}
sub accept_hook {
my $self = shift;
my $fh = $self->stdio_handle;
$self->SUPER::accept_hook(@_);
my $newfh =
IO::Socket::SSL->start_SSL( $fh,
SSL_server => 1,
SSL_use_cert => 1,
SSL_cert_file => $self->{crt},
SSL_key_file => $self->{key}
) or warn "problem setting up SSL socket: " . IO::Socket::SSL::errstr();
$self->stdio_handle($newfh) if $newfh;
}
sub handle_request {
my $self = shift;
my $cgi = shift;
print "HTTP/1.0 200 OK\r\n";
print "\r\n";
print "OK\n";
}
sub stop {
my $self = shift;
my $signal = 15;
if ($self->{pid}) {
kill( $signal, $self->{pid} ) unless $^S;
delete $self->{pid};
}
return;
}
sub background {
my $self = shift;
$self->{pid} = $self->SUPER::background()
or Carp::confess( q{Can't start the test server} );
sleep 1; # background() may come back prematurely, so give it a second to
fire up
return $self->{pid};
}
package main;
use LWP::UserAgent;
my $crt = shift || die "no cert";
my $key = shift || die "no key";
my $ca = shift || die "no ca";
my $server = Server->new($crt, $key);
$server->background();
my $agent = LWP::UserAgent->new();
$ENV{HTTPS_CA_FILE} = $ca;
$ENV{HTTPS_DEBUG} = 1;
my $req = HTTP::Request->new(GET => "https://localhost:8080");
my $response = $agent->request($req);
die unless $response->is_success();
$server->stop();
smime.p7s
Description: S/MIME Cryptographic Signature
