安装ActivePerl-5.26.3.2603-MSWin32-x64-a95bce075.exe(strawberry perl也可以)
安装nasm-2.14.02-installer-x64.exe,默认安装至C:\Program Files\NASM
,系统环境变量PATH添加C:\Program Files\NASM
下载openssl-OpenSSL_1_1_1-stable.zip
这里为您打包好
电脑已安装VS2013(其它版本没有测试,应该下面第3步的路径改一下就行)
1、解压openssl-OpenSSL_1_1_1-stable.zip,获得D:\openssl-OpenSSL_1_1_1-stable
2、打开命令行窗口
3、转至C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
,执行vcvars32.bat
4、转至D:\openssl-OpenSSL_1_1_1-stable
,执行perl configure VC-WIN32 --prefix="D:\openssl\x86"
,完了会提示:
Using os-specific seed configuration
Creating configdata.pm
Creating makefile
如果提示ppm install dmake,则先执行ppm install dmake
,等待下载完了再执行上面的perl。如果下载失败了,要先把C:\Users\xxx\AppData\Local\ActiveState\ActivePerl
里的东西全部删掉,再重新执行ppm
configure后跟着的VC-WIN32
代表编译x86的库,--prefix
代表安装目录,除此之外,还可以设置debug/release、x64/ia64/wince、静态库等等,具体用法参照Build and Install
5、执行nmake
,等待编译完成
6、执行nmake test
,最后会提示PASS。运行前记得关闭杀毒软件
7、执行nmake install
,将会在D:\openssl\x86
生成bin、include、lib三个文件夹,里面只包含了动态库。如果需要静态库,在第4步的时候执行perl configure no-shared VC-WIN32 --prefix="D:\openssl\x86"
注:install中途会拷贝一些文件到C:/Program Files/Common Files/SSL
,因此要以管理员运行命令行,否则它会中断install过程
注:除了个别路径不同,跟x86是一样的,重点看x86的步骤说明
1、解压openssl-OpenSSL_1_1_1-stable.zip,获得D:\openssl-OpenSSL_1_1_1-stable
,若在此之前编译过x86的库,请先把openssl-OpenSSL_1_1_1-stable整个文件夹删掉,重新解压一遍
2、打开命令行窗口
3、转至C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64
,执行vcvars64.bat
4、转至D:\openssl-OpenSSL_1_1_1-stable
,执行perl configure VC-WIN64A --prefix="D:\openssl\x64"
5、执行nmake
,等待编译完成
如果中间报错,X64与目标机器X86冲突的错误,就是第3步错了,把命令行重启一下再执行
6、执行nmake test
,最后会提示PASS
7、执行nmake install
,将会在D:\openssl\x64
生成bin、include、lib三个文件夹
VS2019也可以安装上面的步骤,区别是vcvars64.bat
的路径C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build
2023年重新编译2019年那份源码,发现test阶段报错
mkdir .\test\test-runs
set SRCTOP=.
set BLDTOP=.
set RESULT_D=.\test\test-runs
set PERL=C:\Perl64\bin\perl.exe
set OPENSSL_ENGINES=D:\openssl\src\openssl-OpenSSL_1_1_1-stable\engines
set OPENSSL_DEBUG_MEMORY=on
"C:\Perl64\bin\perl.exe" ".\test\run_tests.pl"
test\recipes\01-test_abort.t .................... ok
test\recipes\01-test_sanity.t ................... ok
test\recipes\01-test_symbol_presence.t .......... ok
test\recipes\01-test_test.t ..................... ok
test\recipes\02-test_errstr.t ................... ok
...
test\recipes\80-test_cms.t ...................... Dubious, test returned 4 (wstat 1024, 0x400)
Failed 4/4 subtests
test\recipes\80-test_cmsapi.t ................... ok
test\recipes\80-test_ct.t ....................... ok
test\recipes\80-test_dane.t ..................... ok
test\recipes\80-test_dtls.t ..................... ok
test\recipes\80-test_dtls_mtu.t ................. ok
test\recipes\80-test_dtlsv1listen.t ............. ok
test\recipes\80-test_ocsp.t ..................... ok
test\recipes\80-test_pkcs12.t ................... skipped: Non-Greek system locale
test\recipes\80-test_ssl_new.t .................. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/28 subtests
test\recipes\80-test_ssl_old.t .................. ok
...
test\recipes\99-test_fuzz.t ..................... ok
Test Summary Report
-------------------
test\recipes\80-test_cms.t (Wstat: 1024 Tests: 4 Failed: 4)
Failed tests: 1-4
Non-zero exit status: 4
test\recipes\80-test_ssl_new.t (Wstat: 256 Tests: 28 Failed: 1)
Failed test: 12
Non-zero exit status: 1
Files=154, Tests=1428, 426 wallclock secs ( 0.44 usr + 0.06 sys = 0.50 CPU)
Result: FAIL
NMAKE : fatal error U1077: “C:\Perl64\bin\perl.exe”: 返回代码“0x1”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.
Github上有人提出该问题Test failure for test_ssl_new due to expired certificates #18456,说是系统时间在2022年1月1日之后就会报错。下载最新版本的源码就可以了官网下载
All tests successful.
Files=159, Tests=2360, 294 wallclock secs ( 0.20 usr + 0.06 sys = 0.27 CPU)
Result: PASS
项目调用静态库,编译时报错
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_ioctlsocket,该符号在函数 BIO_socket_ioctl 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_getsockname,该符号在函数 BIO_sock_info 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_getsockopt,该符号在函数 BIO_sock_error 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2001: 无法解析的外部符号 __imp_getsockopt
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_ntohs,该符号在函数 BIO_get_port 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2001: 无法解析的外部符号 __imp_ntohs
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_gethostbyname,该符号在函数 BIO_gethostbyname 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSAStartup,该符号在函数 BIO_sock_init 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSACleanup,该符号在函数 bio_sock_cleanup_int 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSAGetLastError,该符号在函数 BIO_accept 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2001: 无法解析的外部符号 __imp_WSAGetLastError
1>libcrypto.lib(b_sock2.obj) : error LNK2001: 无法解析的外部符号 __imp_WSAGetLastError
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_getaddrinfo,该符号在函数 BIO_lookup_ex 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_freeaddrinfo,该符号在函数 BIO_ADDRINFO_free 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_getnameinfo,该符号在函数 addr_strings 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 sock_read 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_send,该符号在函数 sock_write 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSASetLastError,该符号在函数 sock_write 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_accept,该符号在函数 BIO_accept_ex 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_bind,该符号在函数 BIO_bind 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_closesocket,该符号在函数 BIO_accept_ex 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_connect,该符号在函数 BIO_connect 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_listen,该符号在函数 BIO_listen 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_setsockopt,该符号在函数 BIO_connect 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_socket,该符号在函数 BIO_socket 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertOpenStore,该符号在函数 capi_open_store 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertCloseStore,该符号在函数 capi_find_key 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertEnumCertificatesInStore,该符号在函数 capi_find_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertFindCertificateInStore,该符号在函数 capi_find_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertDuplicateCertificateContext,该符号在函数 capi_load_ssl_client_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertFreeCertificateContext,该符号在函数 capi_dsa_free 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertGetCertificateContextProperty,该符号在函数 capi_cert_get_fname 中被引用
解决:附加依赖项添加ws2_32.lib
、crypt32.lib