Inhaltsverzeichnis

3.1 Windows x64 Build

This guide walks you step by step through building OpenSSL for Windows 64-bit.


Prerequisites

Make sure all tools are installed:

1. Preparation2. Sources


The build script automates all steps:

# Start build (from any directory)
powershell.exe -ExecutionPolicy Bypass -File "D:\Projects\openssl-3.6.0\build_openssl.ps1"

The script:

  1. Loads Visual Studio environment
  2. Sets PATH for Perl and NASM
  3. Configures OpenSSL
  4. Compiles the code
  5. Installs to D:\Projects\openssl-3.6.0\bin

→ Continue to 4. Testing


Option B: Manual Build

If you want to understand each step:

Step 1: Load Visual Studio Environment

Open a normal CMD (not PowerShell!) and run:

REM Adjust path: Community, Professional, or Enterprise
call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

What happens here?

vcvars64.bat sets important environment variables:

  • PATH - Path to cl.exe, link.exe, nmake.exe
  • INCLUDE - Path to header files
  • LIB - Path to libraries

Verification:

cl

Expected output:

Microsoft (R) C/C++ Optimizing Compiler Version 19.xx.xxxxx for x64

Step 2: Set PATH for Perl and NASM

set PATH=C:\Strawberry\perl\bin;%LOCALAPPDATA%\bin\NASM;%PATH%

Verification:

perl -v
nasm -v

Step 3: Change to Source Directory

cd /d D:\Projects\openssl-3.6.0\src

Step 4: Configure OpenSSL

perl Configure VC-WIN64A --prefix=D:\Projects\openssl-3.6.0\bin --openssldir=D:\Projects\openssl-3.6.0\bin\ssl

Explanation:

Parameter Meaning
———–———
VC-WIN64A Visual C++, Windows 64-bit, AMD64 architecture
–prefix=… Where the finished files are installed
–openssldir=… Where configuration files are stored

Output (example):

Configuring OpenSSL version 3.6.0 for target VC-WIN64A
Using os-specific seed configuration
Creating configdata.pm
Running configdata.pm
Creating makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   Configuration summary                                        ***
***                                                                ***
**********************************************************************

Step 5: Compile

nmake

Duration: 10-30 minutes depending on hardware. Be patient!

What happens?

  1. Perl generates C code from templates
  2. The C compiler compiles all source files
  3. The linker creates the DLLs and EXEs

Error?Troubleshooting

Step 6: Install

nmake install_sw

install_sw installs only software (without documentation). For everything: nmake install


Result

After successful build you'll find in D:\Projects\openssl-3.6.0\bin:

bin\
├── bin\
│   ├── openssl.exe           # Command line tool
│   ├── libcrypto-3-x64.dll   # Cryptography library
│   └── libssl-3-x64.dll      # TLS library
├── include\
│   └── openssl\              # Headers for C/C++ development
├── lib\
│   ├── libcrypto.lib         # Import library for linker
│   ├── libssl.lib
│   └── ossl-modules\         # Provider modules (default, legacy)
└── ssl\
    └── openssl.cnf           # OpenSSL configuration

Quick Verification

D:\Projects\openssl-3.6.0\bin\bin\openssl.exe version -a

Expected output:

OpenSSL 3.6.0 11 Feb 2025 (Library: OpenSSL 3.6.0 11 Feb 2025)
built on: ...
platform: VC-WIN64A
options:  bn(64,64)
compiler: cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 ...

Complete PowerShell Script

If you want to create the build script yourself:

# build_openssl.ps1 - OpenSSL 3.6.0 Build Script
 
$ErrorActionPreference = "Stop"
 
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "OpenSSL 3.6.0 Build Script" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
 
# Paths
$projectRoot = "D:\Projects\openssl-3.6.0"
$srcDir = "$projectRoot\src"
$binDir = "$projectRoot\bin"
$vsPath = "C:\Program Files\Microsoft Visual Studio\2022\Community"
$vcvarsPath = "$vsPath\VC\Auxiliary\Build\vcvars64.bat"
 
# Load Visual Studio environment
Write-Host "`n[1/5] Loading Visual Studio environment..." -ForegroundColor Yellow
 
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "cmd.exe"
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/c `"`"$vcvarsPath`" && set`""
 
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$output = $p.StandardOutput.ReadToEnd()
$p.WaitForExit()
 
$output -split "`r`n" | ForEach-Object {
    if ($_ -match "^([^=]+)=(.*)$") {
        [Environment]::SetEnvironmentVariable($matches[1], $matches[2], "Process")
    }
}
 
# Set PATH
Write-Host "[2/5] Setting PATH for Perl and NASM..." -ForegroundColor Yellow
$env:PATH = "C:\Strawberry\perl\bin;$env:LOCALAPPDATA\bin\NASM;$env:PATH"
 
# Change to source directory
Set-Location $srcDir
 
# Delete old makefile
if (Test-Path "makefile") { Remove-Item "makefile" -Force }
 
# Configure
Write-Host "[3/5] Configuring OpenSSL..." -ForegroundColor Yellow
& perl Configure VC-WIN64A --prefix=$binDir --openssldir=$binDir\ssl
if ($LASTEXITCODE -ne 0) { throw "Configure failed!" }
 
# Compile
Write-Host "[4/5] Compiling OpenSSL..." -ForegroundColor Yellow
& nmake
if ($LASTEXITCODE -ne 0) { throw "nmake failed!" }
 
# Install
Write-Host "[5/5] Installing..." -ForegroundColor Yellow
& nmake install_sw
if ($LASTEXITCODE -ne 0) { throw "Installation failed!" }
 
Write-Host "`n========================================" -ForegroundColor Green
Write-Host "BUILD SUCCESSFUL!" -ForegroundColor Green
Write-Host "Binaries in: $binDir" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green

Continue to


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional