OpenSSL1.0.0e+Net::SSLeay on Windows

I managed to get Net::SSLeay to work with the last OpenSSL release. Here just some not for myself.

OpenSSL test-suite build will fail but the .a and the openssl.exe file are ok.

; LIBPATH=`echo $LIBPATH | sed -e ‘s/ /:/g’`; LD_LIBRARY_PATH=$LIBPATH:$LD_LIBRARY_PATH ${LDCMD} ${LDFLAGS} -o ${APPNAME:=ideatest.exe} ideatest.o ${LIBDEPS} )
make[2]: Leaving directory `/cygdrive/c/strawberry/openssl-1.0.0e/test’
gcc -I.. -I../include -DOPENSSL_THREADS -D_MT -DDSO_WIN32 -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DWHIRLPOOL_ASM -c -o md2test.o md2test.c
md2test.c:1: error: expected identifier or ‘(‘ before ‘!’ token
md2test.c:1: error: stray ‘\377’ in program
md2test.c:1: error: stray ‘\376′ in program
md2test.c:1:14: warning: null character(s) ignored
md2test.c:1:16: warning: null character(s) ignored
md2test.c:1:18: warning: null character(s) ignored
md2test.c:1:20: warning: null character(s) ignored
md2test.c:1:22: warning: null character(s) ignored
md2test.c:1:24: warning: null character(s) ignored
md2test.c:1:26: warning: null character(s) ignored
md2test.c:1:28: warning: null character(s) ignored
md2test.c:1:30: warning: null character(s) ignored
md2test.c:1:32: warning: null character(s) ignored
md2test.c:1:34: warning: null character(s) ignored
: recipe for target `md2test.o’ failed
make[1]: *** [md2test.o] Error 1
make[1]: Leaving directory `/cygdrive/c/strawberry/openssl-1.0.0e/test’
Makefile:255: recipe for target `build_tests’ failed
make: *** [build_tests] Error 1

Administrator@ordi-de-gon▒ri /cygdrive/c/strawberry/openssl-1.0.0e

The openssl.exe binary is in apps/ on Windows, not bin. Net::SSleay Makefile.PL file to find the OpenSSL distribution because of that.

(…)
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x251a): undefined reference to `_imp__CertOpenStore@20′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x255f): undefined reference to `imp__CertFreeCertificateContext@4′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x2576): undefined reference to `_imp__CertCloseStore@8′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x25d5): undefined reference to `_imp__CertEnumCertificatesInStore@8′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x2e1a): undefined reference to `_imp__CertOpenStore@20′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x2e4d): undefined reference to `_imp__CertEnumCertificatesInStore@8′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x2f28): undefined reference to `_imp__CertDuplicateCertificateContext@4′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x2fb1): undefined reference to `_imp__CertCloseStore@8′
c:\strawberry\openssl-1.0.0e\libcrypto.a(e_capi.o):e_capi.c:(.text+0x30e6): undefined reference to `_imp__CertFreeCertificateContext@4′
collect2: ld returned 1 exit status
dmake: Error code 129, while making ‘blib\arch\auto\Net\SSLeay\SSLeay.dll’

The patch applied to get Net::SSLeay to build.

— Net-SSLeay-1.42.orig/inc/Module/Install/PRIVATE/Net/SSLeay.pm 2011-10-03 08:23:34.000000000 +0200
+++ Net-SSLeay-1.42/inc/Module/Install/PRIVATE/Net/SSLeay.pm 2011-12-03 02:22:28.286660290 +0100
@@ -90,7 +90,7 @@ EOM
# libeay32 and ssleay32.
# This construction will not complain as long as it find at least one
# libssl32.a is made by openssl onWin21 with the ms/minw32.bat builder
– push @{ $opts->{lib_links} }, qw( libeay32MD ssleay32MD libeay32 ssleay32 libssl32);
+ push @{ $opts->{lib_links} }, qw( libssl libcrypto Crypt32 );
} else {
$opts->{optimize} = ‘-O2 -g’;
push @{ $opts->{lib_links} },
@@ -172,9 +172,10 @@ sub find_openssl_exec {
my ($self, $prefix) = @_;

my $exe_path;
– for my $subdir (qw( bin sbin out32dll )) {
+ for my $subdir (qw( apps bin sbin out32dll )) {
my $path = File::Spec->catfile($prefix, $subdir, “openssl$Config{_exe}”);
– if ( -x $path ) {
+
+ if ( -e $path ) {
return $path;
}
}