准备工作

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";

}