如何使用Visual Studio 2017在Windows上构建OpenSSL?

How to build OpenSSL on Windows with Visual Studio 2017?

本文关键字:构建 OpenSSL Windows 何使用 Visual Studio 2017      更新时间:2023-10-16

我正在尝试使用OpenSSL,但我被困在编译的步骤上。OpenSSL项目有非常不友好(糟糕(的文档。

如何使用Visual Studio 2017在Windows上构建最新的OpenSSL版本是否有任何实际帮助?

我没有在OpenSSL官方网站上找到任何有用的信息。是的,互联网上有很多关于OpenSSL编译的帖子,但所有这些都已经过时了。

我没有使用VS2017,而是以前的版本。我想这大致相同。请注意,以下说明适用于 OpenSSL 1.1.0 或更高版本。它们不适用于OpenSSL 1.0.2。简而言之,步骤是:

  1. 安装 Perl(ActiveState 或 Strawberry(

[编辑,请参阅下面的(kritzel_sw(评论:我强烈建议使用草莓(]

  1. 安装 NASM

  2. 确保 Perl 和 NASM 都在 %PATH% 上

  3. 使用管理权限启动 Visual Studio 开发人员命令提示符(如果您正在构建 32 位 OpenSSL,请确保使用 32 位命令提示符,如果您正在构建 64 位 OpenSSL,请确保使用 64 位命令提示符(

  4. 从 OpenSSL 源目录的根目录输入perl Configure VC-WIN32,如果你想要 32 位 OpenSSL,或者perl Configure VC-WIN64A如果你想要 64 位 OpenSSL

  5. 输入nmake

  6. 输入nmake test

  7. 输入nmake install

[编辑,除非您更改配置中的目标目录,否则 nmake 安装需要管理员权限。因此,VC 命令提示符必须以管理员身份启动才能完成最后一步]

如果在任何阶段出现任何问题,请检查安装文件和注释。WIN 文件。

量子物理学家python脚本的修改版本

它可以编译OpenSSL 1.0.x或OpenSSL 1.1.x

它可以编译包含多个版本的Visual Studio 2017/2019。

1( 创建文件:CompileOpenSSL.py

import os
import os.path
from subprocess import call
import shutil
import sys
import re
import argparse
# args
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--filename", help="First argument must be the tar.gz file of OpenSSL source", required=True)
parser.add_argument("-a", "--arch", help="Second argument must be x86 or amd64", required=True)
parser.add_argument("-v", "--vs_version", help="Visual Studio version (eg:90, 140, 150)", required=True)
parser.set_defaults(writeVersionInfos=False)
args = parser.parse_args()
compile_flags = "-no-asm"
#compile_flags = "-no-asm -no-shared"
openssl_32_flag = "VC-WIN32"
openssl_64_flag = "VC-WIN64A"
working_dir = os.getcwd()
dirname  = args.filename.replace(".tar.gz","")
src_32_suffix = "_" + "vs" + args.vs_version + "_32"
src_64_suffix = "_" + "vs" + args.vs_version + "_64"
vs_tools_env_var = "VS" + args.vs_version + "COMNTOOLS"

if args.arch != "x86" and args.arch != "amd64":
print("Second argument must be x86 or amd64")
exit(1)

if not bool(re.match("(openssl-){1}(d)+(.)(d)+(.)(d)+(w)+(.tar.gz)",args.filename)):
print("The file given doesn't seem to be an openssl source file. It must be in the form: openssl-x.y.zw.tar.gz")
exit(1)

call("7z x -y " + args.filename) #extract the .gz file
dirname_src_32 = dirname + src_32_suffix
dirname_src_64 = dirname + src_64_suffix
dirname_bin_32 = dirname + src_32_suffix + "_build"
dirname_bin_64 = dirname + src_64_suffix + "_build"
openssl_tar_file = args.filename[0:-3]
if args.arch == "x86":
#delete previous directories
shutil.rmtree(os.getcwd()+'/'+dirname, ignore_errors=True)
shutil.rmtree(os.getcwd()+'/'+dirname_src_32, ignore_errors=True)
#extract tar file for 32
call("7z x -y " + openssl_tar_file)
os.rename(dirname, dirname_src_32)
#Compile 32
os.chdir(dirname_src_32)
print("perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags)
call("perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags,shell=True)
if( os.path.exists("ms/do_ms.bat") ):
call("msdo_ms.bat",shell=True)
print(os.getcwd())
call("nmake -f ms/ntdll.mak",shell=True)
call("nmake -f ms/ntdll.mak install",shell=True)
else:
call("nmake",shell=True)
call("nmake test",shell=True)
call("nmake install",shell=True)
print("32-bit compilation complete.")
#Go back to base dir
os.chdir(working_dir)
################
if args.arch == "amd64":
#delete previous directories
shutil.rmtree(os.getcwd()+'/'+dirname, ignore_errors=True)
shutil.rmtree(os.getcwd()+'/'+dirname_src_64, ignore_errors=True)

#extract for 64
call("7z x -y " + openssl_tar_file)
os.rename(dirname, dirname_src_64)
#Compile 64
os.chdir(dirname_src_64)
call("perl Configure " + openssl_64_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_64) + " " + compile_flags,shell=True)
if( os.path.exists("msdo_ms.bat") ):
call("msdo_win64a.bat",shell=True)
call("nmake -f ms/ntdll.mak",shell=True)
call("nmake -f ms/ntdll.mak install",shell=True)
else:
call("nmake",shell=True)
call("nmake test",shell=True)
call("nmake install",shell=True)
print("64-bit compilation complete.")
#Go back to base dir
os.chdir(working_dir)
################
os.remove(openssl_tar_file)

2( 创建文件:CompileOpenSSL_vs.cmd

ECHO  --------------------------------------
ECHO Require Python, 7Zip, PERL and NASM in PATH
ECHO  --------------------------------------
Rem ------------------------------------------------------
Rem TO CONFIGURE -----------------------------------------
Rem ------------------------------------------------------
Rem SET YOUR LOCAL PATHS-----------------------------------------
SET PATH=C:Program Files (x86)7-Zip;C:Perl64bin;M:BackupCoders_tools7-Zip;%PATH% 
Rem SET YOUR OPENSSL ARCHIVE-----------------------------------------
REM SET FILENAME=openssl-1.0.2r.tar.gz 
SET FILENAME=openssl-1.1.1b.tar.gz
Rem SET THE VERSION OF YOUR VISUAL STUDIO-----------------------------------------
SET VSVERSION=%1

Rem ------------------------------------------------------
Rem COMPILATION LAUNCH -----------------------------------
Rem ------------------------------------------------------
Rem UTILS PATH-----
SET VSCOMNTOOLSNAME=VS%VSVERSION%COMNTOOLS
Rem Pick the good path for Visual Studio-----------------------------------------
IF %VSVERSION% GEQ 150 (
Echo DO NOT FORGET TO ADD A SYSTEM VARIABLE %VSCOMNTOOLSNAME% - like: "C:Program Files (x86)Microsoft Visual Studio2017CommunityCommon7Tools"
SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%....VCAuxiliaryBuildvcvarsall.bat"
) ELSE (
SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%....VCvcvarsall.bat"
)
Rem Set env -----------------------------------------
@pushd "%~dp0"
call %VCVARPATH% %2
@popd
Rem ------------------------------------------------------
Rem TEST APP EXIST -----------------------------------
Rem ------------------------------------------------------
where /q 7z.exe
IF ERRORLEVEL 1 (
ECHO The application "7z.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
PAUSE
EXIT /B
)
where /q perl.exe
IF ERRORLEVEL 1 (
ECHO The application "perl.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
PAUSE
EXIT /B
)
where /q nmake.exe
IF ERRORLEVEL 1 (
ECHO The application "nmake.exe" is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
PAUSE
EXIT /B
)
where /q py.exe
IF ERRORLEVEL 1 (
ECHO The application "py.exe" [shortcut of python] is missing. Ensure to add/install it to the PATH in beginning of this script, check SET PATH
PAUSE
EXIT /B
)
Rem Launch compilation -----------------------------------------
py CompileOpenSSL.py -f %FILENAME% -a %2 -v %VSVERSION%

PAUSE

3(从命令行启动编译(Visual Studio之外( 例如:

CompileOpenSSL_vs.cmd 150 x86
CompileOpenSSL_vs.cmd 150 amd64
CompileOpenSSL_vs.cmd 90 x86

对于OpenSSL 1.0.2,我编写了一个Python脚本来为我构建。我有制作这些脚本的习惯,因为我不喜欢每次需要构建东西时都重新发明轮子。

该脚本是为OpenSSL 1.0.2制作的。对于OpenSSL 1.1.0,这些变化可能很小。

下面是脚本:

import os
from subprocess import call
import sys
import re
vs_version = "140"
compile_flags = "-no-asm -no-shared"

openssl_32_flag = "VC-WIN32"
openssl_64_flag = "VC-WIN64A"
src_32_suffix = "_" + "vs" + vs_version + "_32"
src_64_suffix = "_" + "vs" + vs_version + "_64"
vs_tools_env_var = "VS" + vs_version + "COMNTOOLS"
if len(sys.argv) < 2:
print("First argument must be the tar.gz file of OpenSSL source")
exit(1)
if len(sys.argv) < 3:
print("Second argument must be 32 or 64")
exit(1)
filename = sys.argv[1]
dirname  = filename.replace(".tar.gz","")
working_dir = os.getcwd()
arch = sys.argv[2]
if arch != "32" and arch != "64":
print("Second argument must be 32 or 64")
exit(1)

if not bool(re.match("(openssl-){1}(d)+(.)(d)+(.)(d)+(w)+(.tar.gz)",filename)):
print("The file given doesn't seem to be an openssl source file. It must be in the form: openssl-x.y.zw.tar.gz")
exit(1)

call("7z x " + filename) #extract the .gz file
dirname_src_32 = dirname + src_32_suffix
dirname_src_64 = dirname + src_64_suffix
dirname_bin_32 = dirname + src_32_suffix + "_build"
dirname_bin_64 = dirname + src_64_suffix + "_build"
openssl_tar_file = filename[0:-3]
if arch == "32":
#extract tar file for 32
call("7z x " + openssl_tar_file)
os.rename(dirname, dirname_src_32)
#Compile 32
os.chdir(dirname_src_32)
call("perl Configure " + openssl_32_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_32) + " " + compile_flags,shell=True)
call(r"msdo_ms.bat",shell=True)
call(r"nmake -f msnt.mak",shell=True)
call(r"nmake -f msnt.mak instalL",shell=True)
print("32-bit compilation complete.")
#Go back to base dir
os.chdir(working_dir)
################
if arch == "64":
#extract for 64
call("7z x " + openssl_tar_file)
os.rename(dirname, dirname_src_64)
#Compile 64
os.chdir(dirname_src_64)
call("perl Configure " + openssl_64_flag + " --prefix=" + os.path.join(working_dir,dirname_bin_64) + " " + compile_flags,shell=True)
call(r"msdo_ms.bat",shell=True)
call(r"nmake -f msnt.mak",shell=True)
call(r"nmake -f msnt.mak instalL",shell=True)
print("64-bit compilation complete.")
#Go back to base dir
os.chdir(working_dir)
################
os.remove(openssl_tar_file)

选项 1:将脚本保存到CompileOpenSSL.py,然后下载名称格式应为openssl-1.X.Y.tar.gz的 OpenSSL 源文件。现在假设可以从命令提示符上的全局范围访问 7zip 和 perl,并且您加载了正确的 MSVC 变量(例如vsvars32.bat,或启动正确的终端(,运行以下命令:

python CompileOpenSSL.py openssl-1.X.Y.tar.gz 32

如果您使用的是 MSVC 32 位,或者

python CompileOpenSSL.py openssl-1.X.Y.tar.gz 64

对于 MSVC 64 位。

选项 2:执行脚本手动执行的操作。该脚本只是提取存档,配置源并运行do_ms.bat然后nmake。遵循源头,它会起作用。

祝你好运!

  1. 使用 Visual Studio cmd 进入 SSL 目录并将 Perl 和 NASM 添加到系统路径,然后键入:

  2. perl Configure --openssldir=D:OpenSSLdirectory VC-WIN32

  3. msdo_ms.bat

  4. nmake -f msntdll.mak

  5. nmake -f msntdll.mak install

  6. (享受。