前言:

SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。库中包含很多加密函数,可以对数据进行加密。Openssl整个软件包主要包含三部分:SSL协议库、应用程序、密码算法库。下面主要介绍如何在Windows环境下下载安装Openssl,并配置环境,用C++调用其中的部分函数对数据进行加密。测试案例是:生成一个签名串,这个签名串是腾讯云短信服务中“发送短信”API中需要的必要参数。

下载安装:

下载地址:https://slproweb.com/products/Win32OpenSSL.html,我这里选择的版本是“Win64 OpenSSL v1.1.1L”选择了“EXE”格式,如果你的操作系统是32位或者你的项目是32位的话,就选择下载32位的安装包。安装过程比较简单直接点击下一步即可。

配置Windows环境:

配置环境变量:右键单击“我的电脑”->“属性”->“高级系统设置”,在弹窗中找到“高级”->“环境变量”,新建环境变量,变量名“Path”,变量值为“C:\Program Files\OpenSSL-Win64\bin”,变量值为安装目录;如图1-1所示;

windows_openssl_image1

图1-1

配置VS项目环境:

1、如果要在VS项目中使用SSL库,还需要在VS项目中进行相关设置。我这里使用的是VS2019创建的一个空的C++项目;添加一个“.cpp”文件“Source.cpp”,加入头文件“#include <openssl/sha.h>”和“#include <openssl/hmac.h>”,编译会报错并提示找不到头文件。

2、项目设置:项目-单击右键-属性,在属性面板中找到“VC++ Directories”->“Include Directories(包含目录)",添加新的目录“C:\Program Files\OpenSSL-Win64\include”;同样在库目录“Library Directories”下也添加一个新的目录“C:\Program Files\OpenSSL-Win64\lib”。如图1-2所示。最后配置静态链接库:选择连接器“Linker”->输入“Input”->添加依赖项“Additional Dependercies” 将“libssl.lib、libcrypto.lib”粘贴到空白处,点击确定即可。如图1-3所示。现在再编译项目即可编译通过。到此Openssl的环境配置就完成了,可以尝试调用一下其中的函数,后面会通过一个案例来使用Openssl库。

windows_openssl_image2

图1-2

windows_openssl_image3

图1-3

在UE4C++项目中使用

在 UE4项目中配置Openssl环境(UE4中引用第三方链接库)。 在UE4项目中无法按照文章“在Windows下配置Openssl环境”配置相关环境,UE4的项目属性中没有“链接器->输入”,所以无法指定第三方静态链接库。UE4引用第三方静态链接库需要在“.Build.cs”文件中配置。 首先在插件的根目录的下创建文件夹“ThirdParty”,然后去“Openssl”的安装目录下找到文件夹“OpenSSL-Win64”(我这里的目录为“C:\Program Files\OpenSSL-Win64”),最后将这个文件夹复制到“ThirdParty”中,并保留文件夹“Include”、“Lib”两个文件夹,其余全删除。如图1-4所示。

windows_openssl_image4

图1-4

在VS工程模块中的“.build.cs”文件中加载第三方静态链接库,代码如下所示。

// Some copyright should be here… using System.IO; using UnrealBuildTool;

public class SimpleHttp : ModuleRules { /——————Begin——————/ private string ModulePath { // get { return Path.GetDirectoryName(RulesCompiler.GetModuleFilename(this.GetType().Name)); } get { return ModuleDirectory; } }

private string ThirdPartyPath { get { return Path.GetFullPath(Path.Combine(ModulePath, “../../ThirdParty/”)); } } private string MyLibPath //第三方库MyTestLib的目录 { get { return Path.GetFullPath(Path.Combine(ThirdPartyPath, “OpenSSL-Win64”)); } } /——————End——————/

public SimpleHttp(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);

PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);

PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
// ... add other public dependencies that you statically link with here ...
}
);

PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"HTTP",
// ... add private dependencies that you statically link with here ...
}
);

DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
/*------------------Begin------------------*/
LoadThirdPartyLib(Target);
/*------------------End------------------*/
}

/*------------------Begin------------------*/
public bool LoadThirdPartyLib(ReadOnlyTargetRules Target)
{
bool isLibrarySupported = false;
if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32))//平台判断
{
isLibrarySupported = true;
System.Console.WriteLine("----- isLibrarySupported true");
//string PlatformSubPath = (Target.Platform == UnrealTargetPlatform.Win64) ? "Win64" : "Win32";
string LibrariesPath = Path.Combine(MyLibPath, "Lib");
PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath,/* PlatformSubPath,*/ "libssl.lib"));//加载第三方静态库.lib
PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath,/* PlatformSubPath,*/ "libcrypto.lib"));//加载第三方静态库.lib
}
if (isLibrarySupported) //成功加载库的情况下,包含第三方库的头文件
{
// Include path
System.Console.WriteLine("----- PublicIncludePaths.Add true");
PublicIncludePaths.Add(Path.Combine(MyLibPath, "Include"));
}
return isLibrarySupported;
}
/*------------------End------------------*/
}

然后编译会报错显示“UI”定义重复了,根据报错打开Openssl库中对应的头文件“ossl_Type.h”,在第144行处: 由 typedef struct ui_st UI; 改为(可以改为任意名) typedef struct ui_st UI_L;

改完后重新编译即可。