Can't get OpenSSL to run on Windows (same code works fine on Linux)
I recently wrote a desktop app for Linux(VirtualBox) that employs openSSL. I’m just using the libraries for encrypting and decrypting files (no network) and it works great. Now, I’m trying to create a Windows version and it’s one of the most frustrating things I’ve ever done.
So far, the online community hasn’t been much help (dozens of proposed solutions, all completely different, and none of them work for me).
I have a 64-bit machine.
I'm using Qt Creator as my IDE and mingw as my compiler (x86_64-w64-mingw32-gcc.exe).
I've downloaded and installed Win64 OpenSSL v1.0.1g from http://slproweb.com/products/Win32OpenSSL.html
The build and run paths have C:\OpenSSL-Win64\include\openssl;C:\OpenSSL-Win64\bin;C:\OpenSSL-Win64\lib
In the .pro file I have:
HEADERS += openssl/opensslconf.h openssl/evp
LIBS += -L"C:/OpenSSL-Win64/lib" -llibeay32
CONFIG+= configure.exe -openssl-linked OPENSSL_LIBS="-llibssl -llibcrypto -lgdi64" -l ws2_64 -l advapi64 -l gdi64 -l user64 -l crypt64 -I -static -no-exceptions
QMAKE_LFLAGS += -static -static-libgcc -static-libstdc++ -openssl-linked
The app compiles and runs, but when I get to this line:
@EVP_EncryptInit(&ctxE, EVP_aes_256_cbc(), constKey, constIv);@
It crashes with a segmentation fault.
If I use this line before the above (as suggested by another coder), I get the same segmentation fault:
So, it has noting to do with the key or iv. It's like the app can see the header but not the code. I have tried many, many suggested solutions with no progress.
Any help would be greatly appreciated.
I think you need to compile Qt itself with your OpenSSL first, then you can start using it in your apps.
Thanks for the response. How do I do that?
Asking uncle Google is always a good idea ;) "Link":http://qt-project.org/wiki/Compiling-OpenSSL-with-MinGW.
Thanks for the reply.
The reason I ask is because I'm not sure what "compiling Qt itself with your OpenSSL" means. I downloaded OpenSSL and ran the executable which set up the directory structure for it. Then, I added the libraries and paths to my project. I thought that when I compiled my project in Qt Creator, everything I need would be compiled in the app or know where to get it.
The link you gave me instructs me on how to install OpenSSL on Linux. I already have it working on Linux.
That link is for Windows...
OK, then see "this thread":http://qt-project.org/forums/viewthread/26029.
I am sure there was a good tutorial on this somewhere, but I am not able to find it at the moment.
export and ./Configure looked like Linux commands to me. Both gave me an error: "is not recognized as an internal or external command, operable program or batch file" from the Windows command prompt.
The instructions in the link looked to me to do what I have already done - download and install OpenSSL and set up the paths.
I tried running the Configure script, but I don't have an msys directory. I downloaded msys (MSYS-1.0.11.exe) and the installation told me I already had "Minimal SYStem installed". I don't know where it is. I did a search for Configure on my entire system and nothing came up.
This is not a trivial problem. I've been at this a long time and have done extensive web searches with no solution.
Which version of Qt are you trying to build ? With what compiler ?
I'm using Qt 5.1.1 and this is my compiler: x86_64-w64-mingw32-gcc.exe. I also set it up using Microsoft Visual C++ Compiler 11.0(amd64), which compiles and runs and gives me the same segmentation fault as described above.
Just to be sure we are on the same line: you are going to build Qt with openssl ? Correct ?
If so, you should consider getting the latest sources first. Then decide where you are going to use MinGW or VS to do that
I already built this app for Linux and it's been working great for months. I use the OpenSSL libraries only for encryption/decryption. I created a .pro file for the Windows version, which has all the Windows config, paths, etc. But, it uses the same source files.
The latest Qt version is 5.2.1 which is only one rev from what I'm using. The reason I chose 5.1.1 was because that what the Linux app was built from.
It's just not seeing the compiled code for OpenSSL.
Oh wait, I might have misunderstood you. Are you calling OpenSSL functions directly in your code ?
[quote author="SGaist" date="1398287845"]Oh wait, I might have misunderstood you. Are you calling OpenSSL functions directly in your code ?[/quote]
AFAIK he is, see the initial post.
[quote author="sierdzio" date="1398322738"][quote author="SGaist" date="1398287845"]Oh wait, I might have misunderstood you. Are you calling OpenSSL functions directly in your code ?[/quote]
AFAIK he is, see the initial post.[/quote]
Indeed, then the most likely problem is that the downloaded OpenSSL wasn't built with MinGW 64
So, I downloaded a mingw64 build of OpenSSL from http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.8.0/64-bit/.
The first problem is that there is no libeay.dll in this distribution and my app won't compile without it. I don't know where to get it or where it goes; there is no lib directory in my new OpenSSL directory, which is where libeay.dll usually lives.
Secondly, when I try to run the following perl script in the MINGW32:~ shell
perl Configure mingw -no-share -no-asm --prefix=/C/openssl-1.0.1g
I get the error "Can't open perl script "Configure": No such file or directory.
I found some folks online with the same error as above, but their solutions didn't apply or didn't work for me.
I thought I could just include the new OpenSSL in my qt app and let Qt Creator compile the SSL stuff, but without libeay.dll, I'm dead in the water.
Is it a static build of OpenSSL ?
I want it to be, otherwise I'd have to install OpenSSL on all the machines it will run on. At this point, I'd be happy with any build that works.
You wouldn't need to install OpenSSL on every machine, just deploy the dlls with your application.
Just stumble upon "this":http://qt-project.org/wiki/Compiling-OpenSSL-with-MinGW might help
Yeah, I've looked at that page many times. sierdzio included that link in this forum earlier. I cannot get those scripts to run (see previous posts).
I also tried running them in a mingw32:~ shell unsuccessfully (error = "Can't open perl script "Configure": No such file or directory). I also tried configure and ./configure and ./Configure, no dice.
Just to rule out the obvious, do you have perl installed ?
Yup. I installed Active Perl also and tried that. Changed paths,etc. It seems to run perl; it just doesn't know what configure is.
Just thought of something when reading your configure.exe line.
Since it can't find configure, are you building from the sources ?
If not, then it's the first thing to get. Next what you need to add to the configure line is:
@./configure.exe -openssl-linked -I C:\OpenSSL-Win32\include -L C:\OpenSSL-Win32\lib@