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++ 环境完整安装, 不然会少很多东西
1.0.2 版本和 1.1.1 版本的编译方式不一样这里分为两种方式
- 下载并安装 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 版本
在完成所有上述步骤, 我们就可以解压缩 OpenSSL 包 (解压至: E:\openssl-1.0.2l), 在对它进行修改便可以编译了。解压后的目录中有两个文件 INSTALL.W32、INSTALL.W64 需要被关注。打开其中任何一个文件, 你会看到如何编译 OpenSSL 的各个步骤。
- 打开 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
- 配置编译文件及安装目录, 输入
# 将其安装到 E:\OpenSSL
# perl Configure { VC-WIN32 | VC-WIN64A | VC-WIN64I | VC-CE }
# VC-WIN32 | VC-WIN64A 分别对应 x86 和 x64
perl Configure VC-WIN32 --perfix=E:\OpenSSL
# 编译 Win32
perl Configure VC-WIN32 --prefix=E:\OpenSSL
# 编译 Win64
perl Configure VC-WIN64A
- 搭建编译环境
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
不是内部或外部命令
- 编译 OpenSSL
不能同时生成静态库和动态库. 要清空 out32dll
文件夹再生成另外一个
# 编译动态库
nmake -f ms\ntdll.mak
# 编译静态库
nmake -f ms\nt.mak
- 输入命令执行后若最终显示
passed all tests
说明生成的库正确
nmake -f ms\nt.mak test
- 输入命令执行后则会在
E:\OpenSSL
目录下生成 bin、include、lib、ssl 四个文件夹
nmake -f ms\nt.mak install
注意事项
- 以上编译的是 release 库, 若编译 debug 库, 则将以上第 3 步中的
VC-WIN32
改成debug-VC-WIN32
,VC-WIN64A
改成debug-VC-WIN64A
即可 - 若生成不带汇编支持的库, 则需将以上第 3 步用
perl Configure VC-WIN64A no-asm --prefix=E:\OpenSSL\
替换即可, 增加 no-asm 选项 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/