VC环境OpenSSL安装以及编程过程
SSL就是Secure Sockets Layer,是一种安全套接字协议。
配置过程中需要生成一些mak文件,这些生成代码用perl脚本生成,所以要安装一个ActivePerl
ActivePerl:http://www.activestate.com/activeperl/
openss:http://www.openssl.org/ (本文使用openssl-1.0.0-beta5)
参考 openssl 目录下的 install.win32 说明进行安装:
1 、进入解压目录。
>cd C:/ openssl-1.0.0-beta5
2 、运行 Configure 。
>perl Configure VC-WIN32
如不成功会有明显提示。
3 、创建 Makefile 文件。
>ms/do_ms
推荐使用这种方式,另外两种方式 如果使用也必须保证本机有编译器才能使用。
:ms/do_masm (默认 vc 自带的编译器;也也以自己下载安装)
:ms/do_nasm (需要自己下载)
4 、配置 VC 环境变量。
>cd C:/Program Files/Microsoft Visual Studio/VC98/Bin
>vcvars32.bat
5 、编译动态链接库。
>cd C:/openssl-0.9.8k
>nmake -f ms/ntdll.mak
如果编译成功,最后的输出都在 out32dll 目录下:包括可执行文件、两个 dll ( ssleay32.lib, libeay32.lib )和两个 lib 文件( ssleay32.dll, libeay32.dll )。
6 、为 VC 添加头文件和静态链接库路径。
Tools à Options à Directores ,在 Include files 中增加 C:/openssl-0.9.8k /inc32 目录;在 Libray files 中增加 C:/openssl-0.9.8k/out32dll 。
7 、编写 OpenSSL 程序,可参考 C:/openssl-0.9.8k/demos
( 1 )包含相应头文件
#include h >
(2) 添加静态链接库
#pragma comment (lib, "libeay32.lib" )
#pragma comment (lib, "ssleay32.lib" )
或 Project à Settings à Link à Object/library modules 填写 libeay32.lib ssleay32.lib 。
( 3 )将动态链接库ssleay32.dll, libeay32.dll 复制到 C:/WINDOWS/system32 或 Debug 目录下,确保动态链接库在正确的路径。
+++++++++++++ 一些安装出错的处理++++++++++++++++
如何在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms\do_ms.bat
在解压目录下执行ms\do_ms.bat命令
6、nmake -f ms\ntdll.mak
7、nmake -f ms\nt.mak
测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
上面的方法编译旧的版本是没有问题的,当时在编译最新的版本可能会报错:
Assembling: tmp32\sha1-586.asm
tmp32\sha1-586.asm(1427) : error A2070: invalid instruction operands
tmp32\sha1-586.asm(1571) : error A2070: invalid instruction operands
NMAKE : fatal error U1077:
'ml'
:
return
code
'0x1'
Stop.
解决:
把第4步改为 perl Configure VC-WIN32 no-asm 然后继续5,6,7步
然后又会报下面类似的连接错误:
提示错误:cryptlib.obj : error LNK2001: unresolved external symbol _OPENSSL_ia32_cpuid
out32dll/libeay32.dll : fatal error LNK1120: 1 unresolved externals
修改ms/do_ms.bat 为:
perl util/mkfiles.pl >MINFO
perl util/mk1mf.pl debug no-asm VC-WIN32 >ms/nt.mak
perl util/mk1mf.pl debug dll no-asm VC-WIN32 >ms/ntdll.mak
perl util/mk1mf.pl debug no-asm VC-CE >ms/ce.mak
perl util/mk1mf.pl debug dll no-asm VC-CE >ms/cedll.mak
perl util/mkdef.pl 32 libeay > ms/libeay32.def
perl util/mkdef.pl 32 ssleay > ms/ssleay32.def
编译后
在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件
注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。
于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。
继续执行nmake -f ms\ntdll.mak
如何在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms\do_ms.bat
在解压目录下执行ms\do_ms.bat命令
6、nmake -f ms\ntdll.mak
7、nmake -f ms\nt.mak
测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
上面的方法编译旧的版本是没有问题的,当时在编译最新的版本可能会报错:
Assembling: tmp32\sha1-586.asm
tmp32\sha1-586.asm(1427) : error A2070: invalid instruction operands
tmp32\sha1-586.asm(1571) : error A2070: invalid instruction operands
NMAKE : fatal error U1077: 'ml' : return code '0x1'
Stop.
解决:
把第4步改为 perl Configure VC-WIN32 no-asm 然后继续5,6,7步
然后又会报下面类似的连接错误:
提示错误:cryptlib.obj : error LNK2001: unresolved external symbol _OPENSSL_ia32_cpuid
out32dll/libeay32.dll : fatal error LNK1120: 1 unresolved externals
修改ms/do_ms.bat 为:
perl util/mkfiles.pl >MINFO
perl util/mk1mf.pl debug no-asm VC-WIN32 >ms/nt.mak
perl util/mk1mf.pl debug dll no-asm VC-WIN32 >ms/ntdll.mak
perl util/mk1mf.pl debug no-asm VC-CE >ms/ce.mak
perl util/mk1mf.pl debug dll no-asm VC-CE >ms/cedll.mak
perl util/mkdef.pl 32 libeay > ms/libeay32.def
perl util/mkdef.pl 32 ssleay > ms/ssleay32.def
编译后
在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件
注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。
于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。
继续执行nmake -f ms\ntdll.mak
++++++++++++++++++++++++++++++
*****************VC6 不用安装配置 openssl***************
做软件开发的人, 基本都应该听说过大名鼎鼎的开源软件openssl, 下面, 我们来入门openssl编程吧。 初学者如果想了解openssl编程, 最不喜欢是: 还没有懂怎么利用openssl是怎么个玩法, 就不得不学openssl本身的编译。 在本文中, 我直接省略如何编译openssl这个过程, 直接把编译的最后结果(库和头文件)提供给大家, 希望大家能用得上。先用openssl来玩一下, 感觉有趣的话, 再去学学openssl的编译。
下面来进行详细的介绍, 介绍openssl的使用(而不是openssl的库的编译):
1. 首先在我的博客资源中下载Win32OpenSSL-1_0_1.rar, 然后解压得到Win32OpenSSL-1_0_1.exe, 对了, 我马上就上传到我的csdn资源中, 免费提供, 不需要积分哈, 不要害怕, 动起来。
2. 安装Win32OpenSSL-1_0_1.exe, 主要是为了得到编译好的openssl库和头文件。 安装后, 在安装目录中有OpenSSL-Win32这个文件夹, 我是直接安装在C盘里面的, 所以其目录是:C:\OpenSSL-Win32, 在这个C:\OpenSSL-Win32目录下, 有很多openssl的库和头文件, 截图给大家看看, 方便大家核对:
3. 在VC++6.0中建立代码文件main.cpp(这个过程我就不讲了), 随后要记得增加对C:\OpenSSL-Win32目录下的库和头文件的索引, 方法是, 选择菜单栏中的"Tools", 然后选择“Options...”, 然后添加索引, 如图:
好了, 至此为止, VC++就增加了对openssl的索引, 前戏已经搞完, 可以开始做正事了。
4. man.cpp中的C++代码为:
- #include
- #include // 如果你直接拷贝我的程序运行, 那注定找不到md5.h
- #pragma comment(lib, "libeay32.lib")
- #pragma comment(lib, "ssleay32.lib") // 在本程序中, 可以注释掉这句
- using namespace std;
-
- int main()
- {
- const char *data = "hello world";
- unsigned char md[16] = {0};
-
- MD5_CTX ctx;
- MD5_Init(&ctx);
- MD5_Update(&ctx, data, strlen(data));
- MD5_Final(md, &ctx);
-
- int i = 0;
- char buf[33] = {0};
- char tmp[3] = {0};
- for(i = 0; i < 16; i++ )
- {
- sprintf(tmp,"%02X", md[i]);
- strcat(buf, tmp);
- }
-
- cout << buf << endl;
-
- return 0;
- }
openssl编程注意事项:
http://blog.csdn.net/fyang2007/article/details/6180394
另外可参考网址:
http://wenku.baidu.com/link?url=kj7TSsCqmQ03XCiIcnOS0URhDKpUDaSE_8l1-WAqAyJ7INX2zvo7St7nFleEt2qL5NVbkEE6oifnpFR4baeJ9xOu1qXqGSlgwhBcx-oM4tS