Linux使用Mingw-w64为Windows交叉编译Openssl

1,前言

2,安装编译工具

1
2
3
sudo apt update
sudo apt install build-essential unzip
sudo apt install mingw-w64

3,下载openssl源码及编译openssl

  1. OpenSSL的依赖很少,仅需要 ANSI C编译器(推荐GCC),Perl 5,make,GNU BC(仅测试程序依赖)。

  2. 直接下载源码并配置

1
2
3
4
5
6
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1a.zip
unzip OpenSSL_1_1_1a.zip
cd openssl-OpenSSL_1_1_1a/
mkdir build
cd build
../Configure mingw64 --prefix=/mnt/c/Users/leux/Documents/Debian/dev/openssl shared no-asm
  1. Configure 的一些配置选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 全局选项:
--openssldir=OPENSSLDIR # 安装目录,默认是 /usr/local/ssl 。
--prefix=PREFIX # 设置 lib include bin 目录的安装路径,默认为 OPENSSLDIR 目录。
--install_prefix=DESTDIR # 设置安装时以此目录作为"根"目录,通常用于打包,默认为空。

zlib 或 zlib-dynamic 或 no-zlib # 使用静态的zlib压缩库、使用动态的zlib压缩库、不使用zlib压缩功能。
threads 或 no-threads # 是否编译支持多线程的库,默认支持。
shared 或 no-shared # 是否生成动态连接库。
asm 或 no-asm # 是否在编译过程中使用汇编代码加快编译过程。

enable-sse2 或 no-sse2 # 启用/禁用SSE2指令集加速,如果你的CPU支持SSE2指令集,就可以打开,否则就要关闭。
gmp 或 no-gmp # 启用/禁用GMP库
rfc3779 或 no-rfc3779 # 启用/禁用实现X509v3证书的IP地址扩展
krb5 或 no-krb5 # 启用/禁用 Kerberos 5 支持
ssl 或 ssl2 或 ssl3 或 tls # 启用 SSL(包含了SSL2/SSL3) TLS 协议支持。
no-ssl no-ssl2 或 no-ssl3 或 no-tls # 禁用 SSL(包含了SSL2/SSL3) TLS 协议支持。
dso 或 no-dso # 启用/禁用调用其它动态链接库的功能,no-dso仅在no-shared的前提下可用。
1
2
3
4
5
# 算法选项:				# 理论上这些算法都可以通过"no-*"语法禁用
no-md2,no-md4,no-mdc2,no-ripemd # 这些都是摘要算法,含义一目了然。
no-des,no-rc2,no-rc4,no-rc5,no-idea,no-bf,no-cast,no-camellia # 这些都是对称加密算法,含义一目了然。"bf"是"Blowfish"的意思。
no-ec,no-dsa,no-ecdsa,no-dh,no-ecdh # 这些都是不对称加密算法,含义一目了然。
no-comp,no-store # 数据压缩算法和对象存储功能。因为目前实际上并没有压缩算法,所以只是定义了一些空接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 编译选项:				
# OpenSSL不能用 CPPFLAGS CFLAGS LDFLAGS 等环境变量在运行 configure 脚本的时候来设置编译选项。
# 但OpenSSL的 Configure 脚本允许你在命令行上直接输入 CPPFLAGS CFLAGS 的内容。比如:使用 `echo $CFLAGS` 则可以将 CFLAGS 变量添加上来。
# 比如:-DDEVRANDOM='"/dev/urandom"' 可以用来指定随机设备, -DSSL_FORBID_ENULL 则可以用于禁止使用NULL加密算法。

# OpenSSL的 LDFLAGS 是无法通过Configure进行设置的。因为Configure会强制清空Makefile中的LDFLAGS。
# 所以在运行完Configure之后,可以使用一个sed修改所有Makefile中的 LDFLAGS(用于连接openssl)和SHARED_LDFLAGS(用于连接libcrypto,libssl库)。

# 例子如下:不能省略find命令内"Makefile*"两边的引号。

CFLAGS=xxxx
./Configure ... -DSSL_FORBID_ENULL -DDEVRANDOM='"/dev/urandom"' `echo $CFLAGS`
find . -name "Makefile*" -exec sed -r -i -e"s|^(SHARED_)?LDFLAGS=|& $LDFLAGS |" {} \;
  1. 更改 build/Makefile 的第90行 CROSS_COMPILE= ....CROSS_COMPILE=x86_64-w64-mingw32-

  2. 编译并安装

1
2
3
make		# 配置完毕后,最好先使用 make depend 重新建立下依赖关系,特别是你使用了"no-*"选项之后,否则编译可能会失败。
make test # 如果编译成功,那么最好使用 make test 进行一下测试。
make install # 还可以使用 make install INSTALL_PREFIX=/other/dir 来将 /other/dir 当作"根"进行安装或打包。
  • 似乎下面这样也可以,但我未测试
1
2
3
4
5
export "CROSS_COMPILE=x86_64-w64-mingw32-"
export "CC=x86_64-w64-mingw32-gcc"
export "CXX=x86_64-w64-mingw32-g++"
make
make install

4,注意:

  • 为了安装Apache-2.2的mod_ssl成功,SSLv2/SSLv3/TLS都必须开启。

  • OpenSSH 只依赖于crypto的加密库(libcrypto),而带有 HTTPS 支持的 Apache 则依赖于该软件包的加密库和 SSL/TLS 库(libssl)。因此,如果你不打算使用 HTTPS 的话,可以只安装加密库(no-ssl no-tls),为了能够让OpenSSH安装成功,ripemd,des,rc4,bf,cast,dsa,dh目录不能被禁止。