暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

密码学OpenSSL VS2017环境搭建

林元皓 2021-09-11
1329

OpenSSL & BoringSSL

OpenSSL 简介

SSL 是 Secure Sockets Layer(安全套接层协议)的缩写,可以在 Internet 上提供秘密性传输。

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL 采用C语言作为开发语言,这使得 OpenSSL 具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。 OpenSSL 支持 Linux、Windows、BSD、Mac、VMS等平台,这使得 OpenSSL 具有广泛的适用性。但习惯C语言总比使用C++重新写一个跟 OpenSSL 相同功能的软件包轻松不少。

OpenSSL 是一个开源项目,其组成主要包括以下三个组件:

openssl:多用途的命令行工具libcrypto:加密算法库libssl:加密模块应用库,实现了ssl及tls

OpenSSL 的目录结构自然也是围绕这三个功能部分进行规划的。

OpenSSL 密码学

专栏目的

理解密码学涉及到的各种算法。理解密码学各种算法的应用场景。理解 OpenSSL 的各种密码学接口,并理解接口背后的安全知识。能够封装应用密码学知识。

对称加密

OpenSSL一共提供了八种对称加密算法,其中七种是分组加密算法,仅有的一种流加密算法是RC4。

这七种分组加密算法分别是 AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。

其中,AES 使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES 算法里面不仅仅是常用的 DES 算法,还支持三个密钥和两个密钥 3DES 算法。

非对称加密

OpenSSL一共实现了四种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。

DH算法:一般用于密钥交换。RSA算法:既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法:则一般只用于数字签名。

信息摘要

OpenSSL 实现了五种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。

SHA算法:事实上包括了SHA和SHA1两种信息摘要算法。此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

BoringSSL 简介

BoringSSL 是谷歌创建的OpenSSL分支,OpenSSL的代码比较糟糕。Google方面对原有OpenSSL提交大量的漏洞并进行改造,建立分支命名为BoringSSL。

BoringSSL 保留了OpenSSL原有的函数接口,但对算法实现进行了修改和优化,在众多的项目中都是将依赖库改成了 BoringSSL 。

之前《远程调用gRPC VS2017环境搭建》已经讲述了BoringSSL的搭建,但这里会较为详细的讲述对BoringSSL的搭建环境。

这里最终也使用BoringSSL来做依赖库,对OpenSSL进行C++封装。

相关软件安装

安装 perl 脚本解释器

active state perl(perl脚本解释器):https://www.activestate.com/activeperl/

下载安装的版本是:ActivePerl-5.28.1.0000-MSWin32-x64-865dc3eb.msi


安装 nasm 汇编器

nasm(汇编语言编译):https://www.nasm.us/pub/nasm/releasebuilds/

下载安装的版本是:nasm-2.15rc12-installer-x64.exe

默认会安装用户目录:C:\Users\用户名\AppData\Local\bin\NASM

配置Windows的环境变量,将此路径加入到环境变量path中


安装 golong 语言

golang(go语言):https://golang.org/dl/

下载安装的版本是:go1.13.7.windows-amd64.msi

go语言是 BoringSSL 的需求,如果是 OpenSSL 并不需要它。

环境测试

安装好后,重新打开控制台能够运行 perl、nasm 、go 命令



OpenSSL VS2017编译

下载 OpenSSL

OpenSSL:https://www.openssl.org/source/

下载源码的版本是:openssl-3.0.0-alpha16.tar.gz

VS2017 编译

OpenSSL 编译版本分:32位库版本 和 64位库版本。

使用 perl 生成 makefile 文件

命令说明:perl Configure { VC-WIN32 | VC-WIN64A | VC-WIN64I | VC-CE } no-asm --prefix=%OUTPATH%

VC-WIN32 表示生成32位程序、WIN64A 表示生成64位程序no-asm 表示不使用 asm 编译--prefix 是编译后输出的路径,默认会生成到C:\Program Files (x86)目录

根据需求编译的版本,是32位还是64位的,来进入VS2017自带的命令行界面

如果是32位的:进入 x86 Native Tools Command Prompt for VS2017
如果是64位的:进入 x64 Native Tools Command Prompt for VS2017

这里先编译32位,然后再编译64位,进入 OpenSSL 源码目录,并执行 perl 命令:

    cd D:\WorkRoot\OpenSSLProject\openssl
perl Configure VC-WIN32


生成 makefile 文件失败了,提示 at C:/SoftWare/Perl64/lib/ActivePerl/Config.pm line 400
 问题:

解决办法,修改 Config.pm 文件,大约在400行左右:

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

再次执行命令,便成功生成了 makefile 文件了。

用 nmake 编译:

# 编译库源码
nmake
# 编译测试程序
nmake test
# 将编译好的文件安装到指定目录,默认是C:\Program Files (x86)\OpenSSL,如果是在C盘,运行控制台是需要有管理员权限
nmake install

编译好后生成的文件,用于其他项目库的编译,或者复制到需要编译的路径中


同理编译64位的 OpenSSL 即可。

BoringSSL VS2017编译

下载 BoringSSL

BoringSSL:https://boringssl.googlesource.com/boringssl/

虽然已经编译了OpenSSL,但是在使用上,我比较推荐 BoringSSL,其接口和 OpenSSL一致。但更为安全和可靠。

因此我们以后都使用的是 BoringSSL,但为了方便和统一,这里仍然叫 OpenSSL。

VS2017 编译

简化操作,使用 CMake GUI 来直接生成 VS2017 的 BoringSSL.sln 工程。


Configure 和 Generate 后,再 boringssl 的 vsprojects 目录下,便生成了 VS2017 工程文件。


为 BoringSSL 瘦身,boringSSL中,需要保留的项目文件global_targetfipsmodulecryptossl

在 boringssl\vsprojects\ 目录下,创建文件夹 nasm ,将 boringssl\vsprojects\ssl\ssl.dir\nasm.props 文件拷贝到 nasm 中。

然后可以删掉 ssl 目录了。

再把 global_targetfipsmodulecryptossl 这四个工程添加到 我们的 OpenSSLProject 项目前。

需要先修改 global_target.vcxprojfipsmodule.vcxproj 、crypto.vcxproj和 ssl.vcxproj 中的 nasm 相关配置。

使用 Notepad++ 打开这两个文件,搜索 nasm.props


可以看见位置都在 工程的52行,统一改成 <Import Project="$(ProjectDir)nasm\nasm.props" />
 。

需要注意的 nasm.props 文件里记录了,nasm(汇编语言编译)的安装路径<CompilerNasm>C:/SoftWare/NASM/nasm.exe</CompilerNasm>
,如果你拷贝工程到其他电脑时,就需要对应修改下 CompilerNasm 的路径了,否则asm文件无法编译。


编译工程时,发现 crypto 引入了 fipsmodule 编译时,使用的 obj 文件。

这里修改 obj 的关联路径,并且把 fipsmodule 工程的 中间目录 修改一下。



然后便可以编译整体工程,把编译出来的静态库和头文件,引入到你的工程中使用,这里就不多说了。



文章转载自林元皓,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论