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\opensslperl 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 handlemy $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_target、fipsmodule、crypto和ssl。
在 boringssl\vsprojects\ 目录下,创建文件夹 nasm ,将 boringssl\vsprojects\ssl\ssl.dir\nasm.props 文件拷贝到 nasm 中。
然后可以删掉 ssl 目录了。
再把 global_target、fipsmodule、crypto和ssl 这四个工程添加到 我们的 OpenSSLProject 项目前。
需要先修改 global_target.vcxproj、fipsmodule.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 工程的 中间目录 修改一下。


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





