准备工作
1.Perl的安装
从Perl官网(https://www.activestate.com/products/perl/downloads/)下载安装包直接安装就行了。安装完好后命令行执行【perl -v】就可以查看版本信息
2.OpenSSL源码
OpenSSL下载地址:
[Github]:https://github.com/openssl/openssl/tree/master
[码云]:https://gitee.com/mirrors/openssl/tree/master/ (个人推荐码云,服务器在国内下载快)
注:git拉取的代码默认是master的。若需要指定版本,可以使用 git checkout切换分支或者tag,然后按照下面的步骤操作
3.编译openssl
3.1 打开VS2022开发人员命令提示控制台(根据你安装的VS版本决定)。进入OpenSSL源码目录,然后执行
编译x86就选择x86开发人员命令提示控制台;编译x64就选择x64开发人员命令提示控制台;不要搞错了
perl Configure VC-WIN32 no-asm --prefix=D:\openssl_win32 // 生成32位库
或
perl Configure VC-WIN64A no-asm --prefix=D:\openssl_win64 // 生成64位库
解释以上命令:
- VC-WIN32 表示编译选项生成32位的库
- VC-WIN64A 表示编译选项生成64位的库
- VC-WIN64I 表示编译选项生成IA64的库,使用安腾cpu的需要使用此选项,安腾x64架构是inter自家的,比较少见
- no-asm 表示不使用汇编,如果本地安装了nasm工具,可以不使用此选项
- --prefix=D:xxx\xx 表示输出目录
3.2 执行以下代码开始编译
//OpenSSL1.1.0以后执行以下代码
nmake
nmake test
nmake install
// OpenSSL1.1.0以前执行如下代码
ms\do_ms
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak test
nmake -f ms\ntdll.mak install
注1:从openssl 1.1.0版本以后就不再有ms\do_*.bat这样的文件,而是直接使用nmake命令就行了,详见官方文档
注2:执行test可能过不去。因为部分测试网络地址被墙了
注3:执行install可能过不去,因为需要使用管理员权限打开开发命令行
4.添加环境变量
这个看个人需求,需要就加到环境变量里面不需要就算了
5.gmssl的编译
gmssl是基于openssl拉的分支开发的,所以可以按照以上方法编译gmssl
- gmssl的2.x.x版本是可以参照以上过程进行编译
- gmssl的3.x.x版本暂未实验,据说只使用cmake即可
6.下载openssl二进制安装包
可以从以下网址直接下载安装包安装openssl
安装包下载地址
7.某个版本的perl会报错退出,最新版不会出现
提示如下信息:
Can't locate Win32/Console.pm in @INC (you may need to install the Win32::Console module)
(@INC contains: C:\Perl64\site\lib C:\Perl64\lib) at C:\Perl64\lib/ActivePerl/Config.pm line 400.
解决办法:根据提示信息在Perl安装目录找到Config.pm,然后找到400行左右将sub _warn 里面的代码注释,注释完之后如下所示:
# Prevent calling Win32::Console::DESTROY on a STDOUT handle
my $console;
sub _warn {
#my($msg) = @_;
#unless (-t STDOUT) {
#print "\n$msg\n";
#return;
#}
#require Win32::Console;
#unless ($console) {
#$console = Win32::Console->new(Win32::Console::STD_OUTPUT_HANDLE());
#}
#my($col,undef) = $console->Size;
#print "\n";
#my $attr = $console->Attr;
#$console->Attr($Win32::Console::FG_RED | $Win32::Console::BG_WHITE);
#for (split(/\n/, "$msg")) {
#$_ .= " " while length() < $col-1;
#print "$_\n";
#}
#$console->Attr($attr);
#print "\n";
}