Win10 下编译 OpenSSL-1.0.2l | OpenSSL-1.1.1i

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
  • 下载并安装 Nasm 汇编器
    • C:\Program Files\NASM 添加到系统环境变量 Path 中, 安装的时候可选。
    • 下载地址: http://www.nasm.us/
    • nasm-2.13.01-installer-x64.exe
  • 下载并安装 OpenSSL

1.0.2 版本

在完成所有上述步骤, 我们就可以解压缩 OpenSSL 包 (解压至: E:\openssl-1.0.2l), 在对它进行修改便可以编译了。解压后的目录中有两个文件 INSTALL.W32、INSTALL.W64 需要被关注。打开其中任何一个文件, 你会看到如何编译 OpenSSL 的各个步骤。

  1. 打开 2017 控制台
  2. 开始 -> 所有程序 -> 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

img


  1. 配置编译文件及安装目录, 输入
# 将其安装到 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
  1. 搭建编译环境
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 不是内部或外部命令


  1. 编译 OpenSSL

不能同时生成静态库和动态库. 要清空 out32dll 文件夹再生成另外一个

# 编译动态库
nmake -f ms\ntdll.mak

# 编译静态库
nmake -f ms\nt.mak
  1. 输入命令执行后若最终显示 passed all tests 说明生成的库正确
nmake -f ms\nt.mak test
  1. 输入命令执行后则会在 E:\OpenSSL 目录下生成 bin、include、lib、ssl 四个文件夹
nmake -f ms\nt.mak install

注意事项

  1. 以上编译的是 release 库, 若编译 debug 库, 则将以上第 3 步中的 VC-WIN32 改成 debug-VC-WIN32, VC-WIN64A 改成 debug-VC-WIN64A 即可
  2. 若生成不带汇编支持的库, 则需将以上第 3 步用 perl Configure VC-WIN64A no-asm --prefix=E:\OpenSSL\ 替换即可, 增加 no-asm 选项
  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

Snipaste_2020-12-23_03-31-17.png

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

Snipaste_2020-12-22_21-03-50.png

奇怪的报错

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/

最后更新于 2020-12-23
使用 Hugo 构建
主题 StackJimmy 设计