OpenSSL源码编译安装

  • 一、OpenSSL在Linux平台的编译
    • 打包环境
    • 源码准备
    • 编译安装
  • 二、OpenSSL在Windows平台的编译
    • 打包环境
    • 编译32位库
    • 编译64位库
    • 错误处理
    • 编译低版本OpenSSL
  • 三、OpenSSL在Android平台的编译
    • 打包环境
    • 配置环境变量
    • 源码准备
    • 创建编译脚本
    • 执行编译脚本
  • 四、OpenSSL在Mac平台的编译
    • 打包环境
    • 源码准备
    • 执行编译
  • 五、OpenSSL在iOS平台的编译
    • 打包环境
    • 源码准备
    • 创建编译脚本
    • 执行编译脚本

无论在什么平台,OpenSSL的编译一般需要经过三个步骤:

  1. 使用Configure批处理,根据平台环境、选用的编译器及其他参数设置编译的环境变量。
  2. 通过使用批处理指令来根据上面设置好的环境变量生成编译脚本文件。
  3. 使用特定的编译指令进行编译链接。

本文将介绍OpenSSL在Linux、Windows、Android、Mac和iOS平台的编译方式。

一、OpenSSL在Linux平台的编译

打包环境


需要安装perl、make和gcc。

源码准备


编译安装

  1. 执行config
./config --prefix=/home/workspace/openssl/output/64

./config -t

  1. 执行make
make


执行结果:

  1. 执行make test
make test


执行结果:

  1. 执行make install
make install


执行完成后,编译生成的文件将会放到/home/workspace/openssl/output/64目录下:

二、OpenSSL在Windows平台的编译

打包环境


编译工具:Visual Studio 2019

INSTALL文件说明了OpenSSL在Windows编译的方式:

NOTES.WIN文件说明了编译需要的额外依赖工具,我们需要下载安装这些工具,并配置环境变量:

编译32位库

  1. 打开[x86 Native Tools Command Prompt for VS 2019]:【开始】-【所有程序】—【Microsoft visual studio2019】—【x86 Native Tools Command prompt for VS 2019】(以管理员身份运行)
  2. 切换到OpenSSL源码目录
  3. 执行编译
#第一步
#若需要编译静态库需要增加no-shared参数,否则默认生成动态库
#perl Configure VC-WIN32 no-shared --prefix=C:\Users\Username\Desktop\openssl\output\32
perl Configure VC-WIN32 --prefix=C:\Users\Username\Desktop\openssl\output\32
#第二步
nmake
#第三步
nmake test
#第四步
nmake install

编译完成的目标文件:

编译64位库

  1. 打开[x64 Native Tools Command Prompt for VS 2019]:【开始】-【所有程序】—【Microsoft visual studio2019】—【x64 Native Tools Command Prompt for VS 2019】(以管理员身份运行)
  2. 切换到OpenSSl源码目录
  3. 执行编译
#第一步
#若需要编译静态库需要增加no-shared参数,否则默认生成动态库
#perl Configure VC-WIN64A no-shared --prefix=C:\Users\Username\Desktop\openssl\output\64
perl Configure VC-WIN64A --prefix=C:\Users\Username\Desktop\openssl\output\64
#第二步
nmake
#第三步
nmake test
#第四步
nmake install

编译完成的目标文件:

错误处理

注意:若在执行perl Configure VC-WIN32 --prefix=C:\Users\Username\Desktop\openssl\output\32或perl Configure VC-WIN64A --prefix=C:\Users\Username\Desktop\openssl\output\64时出现下列错误

It looks like you don't have either nmake.exe or dmake.exe on your PATH,
so you will not be able to execute the commands from a Makefile.  You can
install dmake.exe with the Perl Package Manager by running:ppm install dmake


执行:

ppm install dmake

若执行ppm install dmake还出现下面的错误:

ppm install failed: DBD::SQLite::db selectrow_array failed: database disk image is malformed


删除C:\Users\FengGuodong\AppData\Local\ActiveState\ActivePerl目录下的文件:

重新执行:

ppm install dmake

等待下载安装完成。

dmake安装完成后,重新开始编译:

#第一步
#编译32位库
#若需要编译静态库需要增加no-shared参数,否则默认生成动态库
#perl Configure VC-WIN32 no-shared --prefix=C:\Users\Username\Desktop\openssl\output\32
perl Configure VC-WIN32 --prefix=C:\Users\Username\Desktop\openssl\output\32#编译64位库
#若需要编译静态库需要增加no-shared参数,否则默认生成动态库
#perl Configure VC-WIN64A no-shared --prefix=C:\Users\Username\Desktop\openssl\output\64
#perl Configure VC-WIN64A --prefix=C:\Users\Username\Desktop\openssl\output\64#第二步
nmake
#第三步
nmake test
#第四步
nmake install

编译低版本OpenSSL

OpenSSL1.0及其以下的版本,编译过程可能略有差别:

# 编译32位动态库
perl Configure VC-WIN32 --prefix=C:\Users\Username\Desktop\openssl\output\32
ms\do_ms.bat
# 可以修改ntdll.mak的CFLAG属性为MT或MD
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak clean
#编译64位动态库
perl Configure VC-WIN64A --prefix=C:\Users\Username\Desktop\openssl\output\64
ms\do_win64a.bat
# 可以修改ntdll.mak的CFLAG属性为MT或MD
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak clean
# 编译32位静态库
perl Configure VC-WIN32 --prefix=C:\Users\Username\Desktop\openssl\output\32
ms\do_ms.bat
# 可以修改nt.mak的CFLAG属性为MT或MD
nmake -f ms\nt.mak
nmake -f ms\nt.makk clean
#编译64位静态库
perl Configure VC-WIN64A --prefix=C:\Users\Username\Desktop\openssl\output\64
ms\do_win64a.bat
# 可以修改nt.mak的CFLAG属性为MT或MD
nmake -f ms\nt.mak
nmake -f ms\nt.makk clean

三、OpenSSL在Android平台的编译

打包环境


NOTES.ANDROID文件说明了在Linux系统环境交叉编译Android库的方式,我们需要安装和配置NDK。

我们将android-ndk-r20b安装在/usr/local/BUILD目录下,那么ndk的编译工具链在目录/usr/local/BUILD/android-ndk-r20b/toolchains下:
NDK必须依赖JDK,Linux环境下搭建Android NDK交叉编译环境请参考《Linux系统Android NDK编译环境搭建》。

配置环境变量

 export JAVA_HOME=/usr/local/BUILD/jdk1.8.0_181export JRE_HOME=${JAVA_HOME}/jreexport ANDROID_NDK=/usr/local/BUILD/android-ndk-r20bexport PATH=${JAVA_HOME}/bin:${ANDROID_NDK}:${PATH}

源码准备


创建编译脚本

在OpenSSL源码目录下创建build.sh,脚本内容如下:

#!/bin/bash
set -e
set -x# Android NDK r17之后不支持使用gcc,需要使用clang编译,若不配置使用clang会提示找不到android-gcc命令
CC=clang
# OpenSSL源码目录
OPENSSL_PATH=/home/workspace/openssl/openssl-1.1.1bfunc_cmp() {make clean &&rm -rf $OPENSSL_PATH/output/$ARCH &&mkdir -p $OPENSSL_PATH/output/$ARCH &&export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH &&./Configure $ARCH_NAME -D__ANDROID_API__=21 --prefix=$OPENSSL_PATH/output/$ARCH &&make && make install
}ARCH_NAME=android-arm
export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH &&
./Configure $ARCH_NAME -D__ANDROID_API__=21 --prefix=$OPENSSL_PATH/output/$ARCH#for ARCH in armeabi-v7a armeabi arm64-v8a x86 x86_64 mips mips64
for ARCH in armeabi-v7a armeabi arm64-v8a x86 x86_64
doecho $ARCHif [ "$ARCH" = "armeabi-v7a" ]; thenARCH_NAME=android-armfiif [ "$ARCH" = "armeabi" ]; thenARCH_NAME=android-armfiif [ "$ARCH" = "arm64-v8a" ]; thenARCH_NAME=android-arm64fiif [ "$ARCH" = "mips" ]; thenARCH_NAME=android-mipsfiif [ "$ARCH" = "mips64" ]; thenARCH_NAME=android-mips64fiif [ "$ARCH" = "x86" ]; thenARCH_NAME=android-x86fiif [ "$ARCH" = "x86_64" ]; thenARCH_NAME=android-x86_64fiecho $TOOL_CHAINfunc_cmp
done

执行编译脚本


等待编译完成,在目录/home/workspace/openssl/openssl-1.1.1b/output下可以找到编译好的目标文件:

四、OpenSSL在Mac平台的编译

打包环境

源码准备


解压后:

执行编译

#第一步
./config --prefix=/Users/ft/Desktop/openssl/openssl-1.1.1b/output
#若需要编译32位的库,需要添加参数KERNEL_BITS=32
#KERNEL_BITS=32 ./config --prefix=/Users/ft/Desktop/openssl/openssl-1.1.1b/output
#第二步
make
#第三步
make test
#第四步
make install

编译生成目标文件:

五、OpenSSL在iOS平台的编译

打包环境

源码准备


解压后:

创建编译脚本

#!/bin/bashset -uOPENSSL_SRC_DIR=${PWD}
OPENSSL_BUILD_DIR=${OPENSSL_SRC_DIR}/output
OPENSSL_BUILD_LOG_DIR=${OPENSSL_BUILD_DIR}/log
OPENSSL_BUILD_UNIVERSAL_DIR=${OPENSSL_BUILD_DIR}/universal
OPENSSL_UNIVERSAL_LIB_DIR=${OPENSSL_BUILD_UNIVERSAL_DIR}/librm -rf ${OPENSSL_BUILD_DIR}mkdir ${OPENSSL_BUILD_DIR}
mkdir -p ${OPENSSL_BUILD_LOG_DIR}
mkdir -p ${OPENSSL_BUILD_UNIVERSAL_DIR}
mkdir -p ${OPENSSL_UNIVERSAL_LIB_DIR}CLANG=$(xcrun --find clang)IPHONE_OS_SDK_PATH=$(xcrun -sdk iphoneos --show-sdk-path)
IPHONE_OS_CROSS_TOP=${IPHONE_OS_SDK_PATH//\/SDKs*/}
IPHONE_OS_CROSS_SDK=${IPHONE_OS_SDK_PATH##*/}IPHONE_SIMULATOR_SDK_PATH=$(xcrun -sdk iphonesimulator --show-sdk-path)
IPHONE_SIMULATOR_CROSS_TOP=${IPHONE_SIMULATOR_SDK_PATH//\/SDKs*/}
IPHONE_SIMULATOR_CROSS_SDK=${IPHONE_SIMULATOR_SDK_PATH##*/}ARCH_LIST=("armv7" "armv7s" "arm64" "i386" "x86_64")
ARCH_COUNT=${#ARCH_LIST[@]}
CROSS_TOP_LIST=(${IPHONE_OS_CROSS_TOP} ${IPHONE_OS_CROSS_TOP} ${IPHONE_OS_CROSS_TOP} ${IPHONE_SIMULATOR_CROSS_TOP} ${IPHONE_SIMULATOR_CROSS_TOP})
CROSS_SDK_LIST=(${IPHONE_OS_CROSS_SDK} ${IPHONE_OS_CROSS_SDK} ${IPHONE_OS_CROSS_SDK} ${IPHONE_SIMULATOR_CROSS_SDK} ${IPHONE_SIMULATOR_CROSS_SDK})config_make()
{ARCH=$1;export CROSS_TOP=$2export CROSS_SDK=$3# 启用bitcodeexport CC="${CLANG} -arch ${ARCH} -miphoneos-version-min=6.0 -fembed-bitcode"# 不启用bitcode#export CC="${CLANG} -arch ${ARCH} -miphoneos-version-min=6.0"make clean &> ${OPENSSL_BUILD_LOG_DIR}/make_clean.logecho "configure for ${ARCH}..."if [ "x86_64" == ${ARCH} ]; then./Configure iphoneos-cross --prefix=${OPENSSL_BUILD_DIR}/${ARCH} no-asm &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-conf.logelse./Configure iphoneos-cross --prefix=${OPENSSL_BUILD_DIR}/${ARCH} &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-conf.logfiecho "build for ${ARCH}..."make &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-make.logmake install_sw &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-make-install.logunset CCunset CROSS_SDKunset CROSS_TOPecho -e "\n"
}for ((i=0; i < ${ARCH_COUNT}; i++))
doconfig_make ${ARCH_LIST[i]} ${CROSS_TOP_LIST[i]} ${CROSS_SDK_LIST[i]}
donecreate_lib()
{LIB_SRC=lib/$1LIB_DST=${OPENSSL_UNIVERSAL_LIB_DIR}/$1LIB_PATHS=( ${ARCH_LIST[@]/#/${OPENSSL_BUILD_DIR}/} )LIB_PATHS=( ${LIB_PATHS[@]/%//${LIB_SRC}} )lipo ${LIB_PATHS[@]} -create -output ${LIB_DST}
}create_lib "libssl.a"
create_lib "libcrypto.a"cp -R ${OPENSSL_BUILD_DIR}/armv7/include ${OPENSSL_BUILD_UNIVERSAL_DIR}echo "done."

执行编译脚本

将编译脚本build.sh拷贝到OpenSSL目录下,开始执行编译:

编译生成目标文件:

OpenSSL之六:OpenSSL源码编译安装相关推荐

  1. 源码编译安装PHP7.4,解决openssl,libxml2,libcurl依赖的问题

    使用源码编译安装PHP7.4是在各种Linux平台上安装PHP的主要形式,通常会遇到各种错误,不是缺少依赖,就是依赖的库版本太低. 主要问题 本人编译PHP碰到的错误主要有如下几个: 1)libxml ...

  2. Splunk安装和配置及源码编译安装SVN

    Splunk安装和配置 http://my.oschina.net/tuyang/blog/189159 http://my.oschina.net/longniao/blog/82766 http: ...

  3. 详解LAMP源码编译安装

    实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MyS ...

  4. mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装

    在CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装过程记录. 一.安装Nginx 1.安装依赖扩展 # yum -y install wget ...

  5. Web服务 源码编译安装LAMP架构

    Web服务 源码编译安装LAMP架构 一.LAMP架构 1.LAMP架构是什么 2.各组件的主要作用 二.编译安装Apache httpd服务 1.关闭防火墙,将安装Apache所需软件包传到/opt ...

  6. opencore0.6.3_Ubuntu 18.04 源码编译安装 PHP 7.3

    记录在Ubuntu 18.04下源码编译安装 PHP 7.3的过程步骤. 0.下载PHP源代码 首先需要从PHP官网下载PHP7.3.1的源代码,保存为php-7.3.1.tar.xz. http:/ ...

  7. 源码编译安装httpd服务

    1 概述 很多软件没有发布rpm包,而是直接发布了源码,好处是这样能兼容更多的平台,但是,用户需要对源码进行编译后安装.利用工具make将源码生成二进制文件. 本文主要讲解了对httpd进行编译安装. ...

  8. zabbix源码编译安装以及添加第一台host监控

    基础准备 硬件需求 数据库需求 软件需求 其他软件需求 安装 安装方式 source code 编译好的二进制包 rpm或者deb 源码编译安装部署zabbix以及附件 前提准备 最小化安装操作系统 ...

  9. linux源码编译安装apache( httpd-2.4.53)处理服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)

    linux源码编译安装apache 首先我们需要下载相关的依赖包 apr.apr-util.pcre 下载地址 http://archive.apache.org/dist/apr/apr-1.7.0 ...

最新文章

  1. Fedora Core 4配置本地yum源
  2. Java学完可以应用在什么领域?这8大领域你要知道
  3. Spring注解 @Qualifier 说明、用法
  4. CF16A Flag
  5. 北京大学计算机系 丁主任,丁骋、李时新参加第七届新闻史论青年论坛暨北京大学新闻学研究会年会...
  6. 物流机器人小车的运动控制与定位
  7. uglifyjs报错 webpack_vue使用uglifyjs-webpack-plugin后打包报错
  8. Linux 命令(84)—— id 命令
  9. 金蝶站点重新输入服务器ip,金蝶KIS客户端和服务器不在同一IP段互相访问
  10. 简单分享apache封IP的方法
  11. Win10修改注册表,提示无法创建密钥
  12. gpasswd 附属组管理,添加用户到附属组中
  13. ubuntu16 安装 teamview 步骤
  14. UEFI 启动 win7
  15. Matlab 图像增强(对数变换)
  16. ECMAScript 简介
  17. 小米手机使用FlutterDownloader下载安卓apk文件不能正常安装
  18. python多个strip_python 中strip方法
  19. 不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
  20. 基于Material实现下拉框多选并且可点击“x”删除(Chips)

热门文章

  1. 三人行均为我师^_^
  2. How to use GDI+?simle introduction about configure
  3. Redis官网下载步骤(含windows版)
  4. 玩转软件|WinRAR压缩软件,去除advert教程
  5. 入手评测 机械革命umipro3怎么样?
  6. 电子版个人简历模板范文十篇
  7. Python | encode中的unicode-escape和raw_unicode_escape
  8. 素描眼睛总是画不好?这一步你是不是忽略了?
  9. Mac Beyond Compare4 破解
  10. 【Java十大热门游戏合集】Java经典游戏项目(附源码课件