SSL preference setting for Crypt-SSLeay-0.51

Taro Kawagishi <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.lwp
Message-ID <[email protected]>
Hello,

this is a patch to add SSL preference to Crypt-SSLeay-0.51 just like
the web browsers have SSL level selection buttons in their security
preference dialog.

Recently trying to automate access to our payroll system with
WWW::Mechanize I had to deal with a web server which doesn't accept
TLS 1.0, but only SSL 3.0.

openssl-0.9.8a/doc/apps/s_client.pod says:

"Unfortunately there are a lot of ancient and broken servers in use which
cannot handle this technique and will fail to connect. Some servers only
work if TLS is turned off with the B<-no_tls> option others will only
support SSL v2 and may need the B<-ssl2> option."

Incidentally the server I managed to connect to says it is:
    IBM_HTTP_Server/6.0.2.3 Apache/2.0.47 (Unix)

Since LWP and WWW::Mechanize use Crypt::SSLeay for SSL I slightly
modified Crypt-SSLeay-0.51 so that I can set preference for SSL levels.

With this patch you can switch off each of SSL v2, SSL v3, and TLS 1.0
by setting environment variables like this:
$ENV{SSL_OP_NO_SSLv2} = 1;
or
$ENV{SSL_OP_NO_SSLv3} = 1;
or
$ENV{SSL_OP_NO_TLSv1} = 1;

The last one will suppress use of TLS 1.0.

Connecting to the payroll site for me involves handling of JavaScript
too, so I extended WWW::Mechanize with JavaScript::SpiderMonkey and it
is almost working.  So I should be able to report this one soon.

Anyway I will put the patch for Crypt-SSLeay-0.51 below.

-Taro

--- Crypt-SSLeay-0.51/SSLeay.xs_original    2003-05-28 
15:55:02.000000000 +0900
+++ Crypt-SSLeay-0.51/SSLeay.xs    2005-12-22 17:12:54.000000000 +0900
@@ -224,6 +224,25 @@
      OUTPUT:
        RETVAL
 
+int
+SSL_CTX_set_NO_SSLv2(ctx)
+     SSL_CTX* ctx
+     CODE:
+     SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|0);
+
+int
+SSL_CTX_set_NO_SSLv3(ctx)
+     SSL_CTX* ctx
+     CODE:
+     SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3|0);
+
+int
+SSL_CTX_set_NO_TLSv1(ctx)
+     SSL_CTX* ctx
+     CODE:
+     SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1|0);
+
+
 MODULE = Crypt::SSLeay        PACKAGE = Crypt::SSLeay::Conn    PREFIX = 
SSL_
 
 SSL*

--- Crypt-SSLeay-0.51/lib/Net/SSL.pm_original    2003-05-28 
15:26:08.000000000 +0900
+++ Crypt-SSLeay-0.51/lib/Net/SSL.pm    2005-12-22 16:41:29.000000000 +0900
@@ -53,6 +53,8 @@
     *$self->{'ssl_new_arg'} = $NEW_ARGS;
     *$self->{'ssl_peer_verify'} = 0;
 
+    $self->set_context();
+
     ## Crypt::SSLeay must also aware the SSL Proxy before calling
     ## $socket->configure($args). Because the $sock->configure() will
     ## die when failed to resolve the destination server IP address,
@@ -432,4 +434,21 @@
     $count; # number of successful cert loads/checks
 }
 
+# An excerpt from doc/apps/s_client.pod:
+# Unfortunately there are a lot of ancient and broken servers in use
+# Some servers only work if TLS is turned off with the -no_tls option
+sub set_context {
+    my $self = shift;
+    my $ctx = *$self->{ssl_ctx};
+    if ($ENV{'SSL_OP_NO_SSLv2'}) {
+        $ctx->set_NO_SSLv2();
+    }
+    if ($ENV{'SSL_OP_NO_SSLv3'}) {
+        $ctx->set_NO_SSLv3();
+    }
+    if ($ENV{'SSL_OP_NO_TLSv1'}) {
+        $ctx->set_NO_TLSv1();
+    }
+}
+
 1;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.