一、Windows系统安装OpenSSL
1、 环境:
操作系统:Windows7(32位)64位没有测试,不保证本方法可以成功
VC:VC 6.0(其他VC环境也大同小异,只不过路径有所不同)
2、 实验前准备
2.1 下载
下载OpenSSL地址:
http://www.openssl.org/source/
版本openssl-0.9.8e,注意版本号,开始笔者使用openssl-1.0.1c的版本号(比较新的版本),本方法不能成功安装。
下载ActivePerl地址
http://www.activestate.com/activeperl/downloads
版本号5.16.3.(最新的即可)
下载MASM32地址(因为VC的Bin下需要一个ml.exe文件,下载安装好MASM32,将ml.exe拷贝到Bin目录下即可)
最新版即可
2.2 VC环境安装
在此不做详述
3、安装
3.1 安装ActivePerl(安装得到一个per脚本解释器,因为编译OpenSSL需使用)
(1)点击安装包即可,如下图
(2)测试
在安装完后,可以进入命令行模式,进入perl安装目录下,
执行“perlexample.pl”
若显示“Hellofrom ActivePerl!”,则说明Perl安装成功,说明可以使用Perl的相关命令来进行OpenSSL的安装了
3.2 安装OpenSSL
(1)首先初始化VC++6.0的环境变量
切换到VC98的Bin目录下,输入VCVARS32.BAT,显示如下
(注: VCVARS32.bat是注册环境变量,运行后VC才能找到编译所需要的库)
(2)配置编译参数
切换到openssl-0.9.8e目录下(即解压openssl-0.9.8e软件包,得到的文件)
执行perl Configure VC-WIN32 --prefix=c:/openssl-0.9.8e 显示如下:
(3)ms\do_ms
继续在命令行执行ms\do_ms,截图如下:
显示如下:
(3)编译动态链接库
命令行下执行命令(在openssl-0.9.8e目录下):nmake -f ms\ntdll.mak
显示如下:
如果编译成功, 输出在out32dll目录下,包括可执行文件、两个dll和两个lib文件:
libeay32.dll, libeay32.lib, ssleay32.dll,ssleay32.lib
(4)测试
使用命令“nmake -f ms\ntdll.mak test”,显示如下:
说明安装成功,OpenSSL在Windows环境下编译成功。
注:
编译分为两种情况,分为动态库和静态库,我用的方法是动态编译。
(1) 编译动态库:nmake -f ms\ntdll.mak
编译成功文件夹out32dll里输出的文件包括:应用程序的exe文件、lib文件、dll文件
(2) 编译静态库:nmake -f ms\nt.mak
编译成功文件夹out32dll里输出的文件包括:应用程序的exe文件、lib文件
其他命令:
测试OpenSSL动态库:nmake -f ms\ntdll.mak test
测试OpenSSL静态库:nmake -f ms\nt.mak test
安装OpenSSL动态库:nmake -f ms\ntdll.mak install
安装OpenSSL静态库:nmake -f ms\nt.mak install
清除上次OpenSSL动态库的编译,以便重新编译:nmake -f ms\ntdll.mak clean
清除上次OpenSSL静态库的编译,以便重新编译:nmake -f ms\nt.mak clean
(5)安装编译后的OpenSSL到制定目录
命令行下执行命令:nmake -fms\ntdll.mak install
安装编译后的OpenSSL到指定目录。
4、编译遇到的问题以及解决方法
4.1 nmake不是内部或者外部号令或者.bat文件
两种解决办法:
(1)nmake.exe的文件位于C:\ProgramFiles\Microsoft Visual Studio\VC98\Bin目次中,设备景象变量即可。
右键单击我的电脑-->属性-->高等-->环境变量--高级变量(找到path)-->编辑,将C:\Program Files\Microsoft Visual Studio\VC98\Bin加到未尾,重启cmd,新的path才会生效
(2)重新在VC98\Bin目录下执行VCVARS32.BAT,重新设置环境变量
4.2 执行nmake -f ms\ntdll.mak,报错
fatal error C1083: Cannotopen include file: ""windows.h"": No such file or directoryNMAKE : fatal error U1077: ""cl"" : return code""0 x2"" Stop.的错误”
解决办法:
先运行vcvars32,vcvars32.bat用于设置VC号令行编译的环境变量。 再次运行“nmake -fms\ntdll.mak”
4. 3执行nmake -fms\ntdll.mak,提示ml不是可识别的指令
解决方法:
下载安装好MASM32,将ml.exe拷贝到Bin目录下即可。
二、VC环境下编写一个简单OpenSSL程序
1. 配置VC环境
这里主要是将生成的OpenSSL有关库文件的路径添加到VC中。
在VC++ 6.0的工具—>选项—>目录下
Include files下添加OpenSSL安装目录下的include目录;
在Libraryfiles下添加out32dll目录
截图分别如下:
2. 编写OpenSSL程序
以一个大数乘法为例:
编写代码如下,同时将libeay32.lib和ssleay32.lib(编译成功后在out32dll文件夹中生成)拷贝到程序所在目录下即可
#include <openssl/bn.h> #include <string.h> #include <openssl/bio.h> //注意添加这两行,因为用到了这两个库中的函数,可能包含了它的头文件(声明部分),实现部分在这个lib文件中,这个就是告诉编译器链接这个lib文件(不然找不到函数的实现) #pragma comment(lib,"libeay32.lib") #pragma comment(lib,"ssleay32.lib")
int main() { BIGNUM *a,*b,*add; BIO *out; char c[20],d[20]; int ret; a=BN_new(); strcpy(c,"32"); ret=BN_hex2bn(&a,c); b=BN_new(); strcpy(d,"100"); ret=BN_hex2bn(&b,d); out=BIO_new(BIO_s_file()); ret=BIO_set_fp(out,stdout,BIO_NOCLOSE); add=BN_new(); ret=BN_add(add,a,b); if(ret!=1) { printf("err.\n"); return -1; } BIO_puts(out,"bn 0x32 + 0x100 = 0x"); BN_print(out,add); BIO_puts(out,"\n"); BN_free(a); BN_free(b); BN_free(add); BIO_free(out); return 0; } |
运行会报错如下:
解决方法:
(1) 头文件加入 #include "applink.c"
(2) 在VC++ 6.0的工具—>选项—>目录下Include files下添加一条新的路径,即下方蓝色区域,该路径包含上述头文件。
再次运行,成功,显示如下: