OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
lib:包含了所有的库文件(例如:libeay32.lib、ssleay32.lib)。
include:包含了所有的头文件(例如:aes.h、md5.h)。
bin:包含了测试程序、存储证书和密钥的文件(*.pem)。
先决条件
笔者写博客之时,这几个软件为最新版本.
在微软网站下载并安装Visual Studio,我用的是2017 Community版。VS 2017 需要勾选安装C++ 环境完整安装.不然会少很多东西.
- 下载并安装 ActivePerl。
下载地址:http://www.activestate.com/activeperl/downloads
ActivePerl 5.24.1 Build 2402 Windows (64-bit, x64) Windows Installer (EXE)
- 下载并安装Nasm汇编器,并将
C:\Program Files\NASM
添加到系统环境变量Path中,安装的时候可选。
下载地址:http://www.nasm.us/
nasm-2.13.01-installer-x64.exe
- 下载并安装 OpenSSL。
下载地址:http://www.openssl.org/
openssl-1.0.2l.tar.gz, openssl-1.1.1i.tar.gz
1.0.2版本和 1.1.1版本的编译方式不一样这里分为两种方式
1.0.2版本
在完成所有上述步骤,我们就可以解压缩OpenSSL包(解压至:E:openssl-1.0.2l),在对它进行修改便可以编译了。解压后的目录中有两个文件INSTALL.W32、INSTALL.W64需要被关注。打开其中任何一个文件,你会看到如何编译OpenSSL的各个步骤。
1.打开2017控制台:
开始-所有程序—Visual Studio 2017——x64 Native Tools Command Prompt for VS 2017
定位到 X:openssl-1.0.2l
编译64位的需要用x64 Native Tools Command Prompt for VS 2017
编译32位的需要用x86 Native Tools Command Prompt for VS 2017
2.配置编译文件及安装目录,输入
perl Configure VC-WIN32 --perfix=E:\OpenSSL (将其安装到E:\OpenSSL)。 # perl Configure { VC-WIN32 | VC-WIN64A | VC-WIN64I | VC-CE } VC-WIN32 | VC-WIN64A 分别对应 x86和x64 编译Win32: perl Configure VC-WIN32 --prefix=E:\OpenSSL 编译Win64: perl Configure VC-WIN64A
3.搭建编译环境:
x86 ms\do_nasm ms\do_ms x64 ms\do_nasm ms\do_win64a # 对于64位编译,将msdo_ms替换成msdo_win64a
如果没有用第一步的 VS 2017 命令行工具打开 则需要手动初始化编译环境.
将命令提示符定位到C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
, X86输入 vcvars32.bat; x64 输入 vcvars64.bat
会显示Settingenvironment for using Microsoft Visual Studio 2017 x86 tools.
如果没有这一步,会提示nmake不是内部或外部命令
4.编译OpenSSL
nmake -f ms\ntdll.mak(编译动态库) nmake -f ms\nt.mak (编译静态库) # 不能同时生成静态库和动态库. 要清空 out32dll 文件夹再生成另外一个.
5.输入 nmake -f ms\ntdll.mak test若最终显示passed all tests说明生成的库正确
nmake -f ms\nt.mak test
6.输入 nmake -f ms\ntdll.mak install则会在E:\OpenSSL目录下生成bin、include、lib、ssl四个文件夹
nmake -f ms\nt.mak install
提示:
1.以上编译的是release库,若编译debug库,则将以上第2步中的VC-WIN32改成debug-VC-WIN32, VC-WIN64A改成debug-VC-WIN64A即可
2.若生成不带汇编支持的库,则需将以上第2步用perl Configure VC-WIN64A no-asm --prefix=E:\OpenSSL\替换即可
3.E:\OpenSSL\openssl-1.0.2l\tmp32文件夹下包含相应的汇编文件
1.1.1版本
随着新的1.1.0版本的发布,构建过程发生了变化。
从1.1.0开始,没有 ms\do_*.bat
文件了。
x32 compilation on Windows:
perl Configure VC-WIN32 nmake nmake test
x64A compilation on Windows:
perl Configure VC-WIN64A no-shared no-capieng --perfix=E:\openssl-1.1.1i\build64-static-no-capi # perl Configure VC-WIN64A [no-shared|shared] nmake nmake test # 测试通过修改 makefile 的 INSTALLTOP_dir= 参数设置的有问题 nmake install
注意事项
其他项目调用编译好的 openssl 的静态库时在 windows 中会遇到这个错误 Windows CAPI library
因为 openssl 调用了 Windows 的加密库但是你的项目没有添加这个库.
有两种方式解决这个问题.
第一种
项目不需要这个在编译的时候去掉 CAPI engine
编译 openssl 的时候添加 no-capieng
即可解决
第二种
在项目里面添加需要的静态库 crypt32.lib
项目属性 - 链接器 - 输入 - 附加依赖项 中加入: crypt32.lib
1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertFreeCertificateContext@4 referenced in function _capi_free_key 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertGetCertificateContextProperty@16 referenced in function _capi_get_prov_info 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertOpenStore@20 referenced in function _capi_open_store 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertFindCertificateInStore@24 referenced in function _capi_find_cert 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertEnumCertificatesInStore@8 referenced in function _capi_find_cert 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertCloseStore@8 referenced in function _capi_find_key 1>libcrypto.lib(e_capi.obj) : error LNK2019: unresolved external symbol __imp__CertDuplicateCertificateContext@4 referenced in function _capi_load_ssl_client_cert
奇怪的报错
NMAKE : fatal error U1073: don't know how to make '"crypto\bn\bn_dh.c"' Stop. NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"' : return code '0x2' Stop.
再执行nmake 就可以了.
1.0.2版本原文
Windows 下编译 OpenSSL
如何在 Windows 下编译 OpenSSL VS2013
OpenSSL: Nmake fatal error U1077: 'ias' : return code '0x1'
1.1.1版本原文
Why is there no msdo_ms.bat after perl Configure VC-WIN64A?
Compile OpenSSL 1.1.1 with VS 2017 Statically or Dinamically include removed macros.
openssl-1.1.0 - Linker error on Windows
其他
http://download.videolan.org/pub/pub/videolan/vlc/last/win64/