it-swarm.com.de

Wie kann man OpenSSL unter Windows mit Visual Studio 2017 erstellen?

Ich versuche, OpenSSL zu verwenden, aber ich bin beim Kompilieren geblieben. Das OpenSSL-Projekt hat eine sehr unfreundliche (schlechte) Dokumentation.

Gibt es eine tatsächliche Hilfe zum Erstellen der neuesten OpenSSL-Version unter Windows mit Visual Studio 2017?

Ich habe auf der offiziellen OpenSSL-Seite keine hilfreichen Informationen gefunden. Ja, im Internet gibt es viele Artikel über die OpenSSL-Kompilierung, aber alle sind veraltet.

6
AeroSun

Ich habe nicht VS2017 verwendet, sondern frühere Versionen. Ich kann mir vorstellen, dass es so ist. In Kürze sind die Schritte:

  1. Perl installieren (entweder ActiveState oder Strawberry)

  2. Installieren Sie NASM

  3. Stellen Sie sicher, dass sich sowohl Perl als auch NASM in Ihrem% PATH% befinden.

  4. Starten Sie eine Visual Studio Developer-Eingabeaufforderung mit Administratorrechten (stellen Sie sicher, dass Sie die 32-Bit-Version verwenden, wenn Sie 32-Bit-OpenSSL erstellen, oder die 64-Bit-Version, wenn Sie 64-Bit-OpenSSL erstellen.)

  5. Geben Sie im Stammverzeichnis des OpenSSL-Quellverzeichnisses Perl Configure VC-WIN32 ein, wenn Sie 32-Bit-OpenSSL möchten, oder Perl Configure VC-WIN64A, wenn Sie 64-Bit-OpenSSL verwenden möchten

  6. Geben Sie nmake ein

  7. Geben Sie nmake test ein.

  8. Geben Sie nmake install ein.

Wenn irgendetwas schief geht, überprüfen Sie die Datei INSTALL und die Datei NOTES.WIN .

19
Matt Caswell

Für OpenSSL 1.0.2 habe ich ein Python-Skript geschrieben, das den Aufbau für mich übernimmt. Ich habe die Angewohnheit, diese Skripte zu erstellen, da ich das Rad nicht jedes Mal neu erfinden muss, wenn ich etwas bauen muss.

Das Skript wurde für OpenSSL 1.0.2 erstellt. Wahrscheinlich sind die Änderungen für OpenSSL 1.1.0 minimal.

Hier ist das Skript:

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"ms\do_ms.bat",Shell=True)
    call(r"nmake -f ms\nt.mak",Shell=True)
    call(r"nmake -f ms\nt.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"ms\do_ms.bat",Shell=True)
    call(r"nmake -f ms\nt.mak",Shell=True)
    call(r"nmake -f ms\nt.mak instalL",Shell=True)

    print("64-bit compilation complete.")

#Go back to base dir
os.chdir(working_dir)
################

os.remove(openssl_tar_file)

Option 1 : Speichern Sie das Skript in CompileOpenSSL.py und laden Sie die OpenSSL-Quelldatei herunter, deren Name das Format openssl-1.X.Y.tar.gz haben soll. Wenn Sie nun davon ausgehen, dass 7Zip und Perl über den globalen Gültigkeitsbereich Ihrer Eingabeaufforderung erreichbar sind und Sie die richtigen MSVC-Variablen geladen haben (z. B. vsvars32.bat oder das rechte Terminal starten), führen Sie Folgendes aus:

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

Wenn Sie MSVC 32-Bit verwenden, oder 

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

für MSVC 64-Bit.

Option 2 : Tun Sie, was das Skript manuell macht. Das Skript extrahiert einfach das Archiv, konfiguriert die Quellen und führt do_ms.bat und dann nmake aus. Folgen Sie der Quelle und es wird funktionieren.

Viel Glück!

  1. gehen Sie in das SSL-Verzeichnis mit Visual Studio Cmd und fügen Sie Perl und Nasm zum Systempfad hinzu.

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

  3. ms\do_ms.bat

  4. nmake -f ms\ntdll.mak

  5. nmake -f ms\ntdll.mak install

  6. ( genießen. )

Modifizierte Version des Quantenphysikers python script

Es kann OpenSSL 1.0.x oder OpenSSL 1.1.x kompilieren

Es kann mit mehreren Versionen von Visual Studio 2017/2019 kompiliert werden.

1) Erstellen Sie die Datei: 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("ms\do_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("ms\do_ms.bat") ):
        call("ms\do_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) Erstellen Sie die Datei: 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:\Perl64\bin;M:\Backup\Coders\_tools\7-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 Studio\2017\Community\Common7\Tools\"
    SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%..\..\VC\Auxiliary\Build\vcvarsall.bat"
) ELSE (
    SET VCVARPATH="%%%VSCOMNTOOLSNAME%%%..\..\VC\vcvarsall.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) Starten Sie die Kompilierung über die Befehlszeile (außerhalb von Visual Studio), z. B .:

CompileOpenSSL_vs.cmd 150 x86
CompileOpenSSL_vs.cmd 150 AMD64

CompileOpenSSL_vs.cmd 90 x86
0
Ti-R