对于仓颉(Cangjie)开发者来说,使用加密相关功能时,crypto-ffi 库是一个重要的工具。它基于 OpenSSL 实现了多种加密算法,让仓颉开发者能够轻松使用专业的加密功能。本文将详细介绍如何配置 crypto-ffi 库及其依赖的 OpenSSL 环境,即使你是编程新手也能轻松跟上步骤。
关于 crypto-ffi 和 crypto4cj
你可能会疑惑:crypto-ffi 和 crypto4cj 是什么关系?
Q: 请问该项目和 crypto4cj 是一个项目吗,还保留有 crypto4cj 中支持 0.55.3 版本的 tag 或分支吗?
Author: 是一个项目,但是 crypto4cj 不再维护,建议使用本项目 crypto-ffi
根据作者说明,crypto-ffi 和 crypto4cj 是同一个项目的不同阶段。目前 crypto4cj 已经不再维护,作者建议所有开发者使用最新的 crypto-ffi 项目。这意味着如果你之前使用过 crypto4cj,现在应该迁移到 crypto-ffi 来获得更好的支持和更新。
导入 crypto-ffi 库
使用仓颉的包管理工具 cjpm 可以轻松导入 crypto-ffi 库,无需手动下载和配置:
bash
# 在你的仓颉项目根目录执行
cjpm install --path path/to/project # 从本地路径 path/to/project 中安装
cjpm install --git url # 从 git 对应地址安装
执行上述命令后,cjpm 会自动处理依赖关系,将 crypto-ffi 库添加到你的项目中。
解决 OpenSSL 依赖问题
使用 crypto-ffi 时,最常见的问题是缺少 OpenSSL 依赖。这是因为 crypto-ffi 需要特定版本的 OpenSSL(3.0.7 版本)才能正常工作。下面我们将详细介绍如何在不同系统上编译和配置这个版本的 OpenSSL。
什么是 OpenSSL?
OpenSSL 是一个强大的开源加密库,提供了各种加密算法、SSL/TLS 协议实现等功能。crypto-ffi 通过调用 OpenSSL 的功能来实现加密相关操作,因此需要在系统中正确配置 OpenSSL。
在 Linux 系统上编译 OpenSSL
步骤 1:下载 OpenSSL 源码
首先,我们需要获取 OpenSSL 3.0.7 的源代码。打开终端,执行以下命令:
bash
# 下载OpenSSL 3.0.7源码包
wget https://www.openssl.org/source/openssl-3.0.7.tar.gz
# 解压源码包
tar -zxf openssl-3.0.7.tar.gz
# 进入解压后的目录
cd openssl-3.0.7
这里的wget
命令用于从网络下载文件,tar -zxf
用于解压.gz 格式的压缩包,cd
命令用于进入目录。
步骤 2:配置编译选项
接下来,我们需要配置编译选项,告诉编译器我们需要生成动态链接库:
bash
# 配置编译选项
./Configure --prefix=/usr/local/openssl shared
参数说明:
--prefix=/usr/local/openssl
:指定编译后的 OpenSSL 将安装到/usr/local/openssl
目录shared
:这个选项非常重要,它告诉编译器生成动态链接库(.so 文件),这是 crypto-ffi 所需要的
如果你需要启用 zlib 压缩支持,可以使用以下命令:
bash
./Configure --prefix=/usr/local/openssl shared zlib-dynamic
步骤 3:编译并安装
配置完成后,就可以开始编译了:
bash
# 编译,-j$(nproc)表示使用所有可用的CPU核心加速编译
make -j$(nproc)
# 如果你知道自己的CPU核心数,也可以手动指定,比如使用2个核心:
# make -j2
编译过程可能需要一段时间(通常几分钟到一小时不等,取决于你的电脑性能)。编译完成后,执行以下命令安装:
bash
# 安装到之前指定的目录
sudo make install
sudo
命令用于获取管理员权限,因为我们要安装到系统目录。执行后,你需要输入你的用户密码。
安装完成后,OpenSSL 的动态链接库会被安装到/usr/local/openssl/lib
目录下。
步骤 4:配置仓颉项目使用
将编译好的动态链接库复制到你的仓颉项目的lib
文件夹中:
bash
# 在你的仓颉项目根目录(默认$HOME/.cjpm/git/crypto-ffi/{hash}/)创建lib文件夹(如果不存在)
mkdir -p lib
# 复制动态链接库
cp /usr/local/openssl/lib/libcrypto.so.3 ./lib/libcrypto.so
cp /usr/local/openssl/lib/libssl.so.3 ./lib/libssl.so
这样,crypto-ffi 就能找到并使用这些库了。
在 Linux 系统上交叉编译 Windows 所需的 OpenSSL
如果你需要在 Windows 使用的 OpenSSL 动态链接库(.dll 文件),可以按照以下步骤进行。
步骤 1:下载源码(与之前相同)
bash
# 下载OpenSSL 3.0.7源码包
wget https://www.openssl.org/source/openssl-3.0.7.tar.gz
# 解压源码包
tar -zxf openssl-3.0.7.tar.gz
# 进入解压后的目录
cd openssl-3.0.7
步骤 2:安装交叉编译工具
交叉编译需要特定的工具链,根据你的 Linux 发行版执行相应命令:
bash
# 如果你使用的是Debian/Ubuntu系统
sudo apt-get update
sudo apt-get install mingw-w64
# 如果你使用的是CentOS/RHEL系统
sudo yum update
sudo yum install mingw64-gcc mingw64-gcc-c++
这些工具允许你在 Linux 系统上编译出能在 Windows 系统上运行的程序。
安装完成后,可以检查是否安装成功:
bash
# 检查是否包含Windows环境需要的头文件(64位系统)
find /usr -name "windows.h" | grep x86_64-w64-mingw32
如果命令输出了文件路径,说明安装成功。
步骤 3:配置交叉编译环境并编译
bash
# 设置交叉编译工具前缀(64位Windows)
export CROSS_COMPILE=x86_64-w64-mingw32-
# 配置编译选项
./Configure mingw64 shared --prefix=/path/to/output/openssl-win-64 -I/usr/x86_64-w64-mingw32/include
参数说明:
mingw64
:指定编译目标为 64 位 Windows 系统shared
:生成动态链接库(.dll 文件)--prefix=/path/to/output/openssl-win-64
:指定输出目录,可以替换为你喜欢的路径-I/usr/x86_64-w64-mingw32/include
:指定 Windows 头文件的位置
然后进行编译和安装:
bash
# 编译,使用多个核心加速
make -j$(nproc)
# 安装到指定目录
sudo make install
步骤 4:查看生成的文件
编译安装完成后,你会在指定的输出目录看到以下结构:
plaintext
openssl-win-64/
├── bin/ # 可执行工具与动态链接库(核心文件)
├── include/ # 开发头文件(编译依赖)
├── lib64/ # 静态链接库与导入库(编译链接依赖)
├── share/ # 文档与示例(辅助参考)
└── ssl/ # 默认配置与证书(运行时配置)
在bin
目录中,我们需要关注这几个文件:
libcrypto-3-x64.dll
:负责底层加密算法(如 RSA、AES、SHA256 等)libssl-3-x64.dll
:负责 SSL/TLS 协议相关功能(如握手、传输加密)openssl.exe
:OpenSSL 命令行工具,用于执行加密 / 解密、证书管理等操作
配置 crypto-ffi 使用编译好的 OpenSSL
无论你是在 Linux 上本地编译还是交叉编译 Windows 版本,都需要将生成的库文件放到 crypto-ffi 能找到的位置。
Windows 系统配置
- 找到 crypto-ffi 在你的系统中的安装目录,通常是:
%USERPROFILE%/.cjpm/git/crypto_ffi/{Hash}/lib
其中%USERPROFILE%
是你的用户目录(类似C:\Users\你的用户名
),{Hash}
是一个由字母和数字组成的字符串,代表你安装的 crypto-ffi 版本。
-
将之前编译得到的
libcrypto-3-x64.dll
和libssl-3-x64.dll
复制到这个目录。 -
重命名这两个文件:
- 将
libcrypto-3-x64.dll
重命名为libcrypto.dll
- 将
libssl-3-x64.dll
重命名为libssl.dll
- 将
-
更新项目配置:
bash# 在你的仓颉项目根目录执行 cjpm update
如果输出
cjpm update success
,说明配置成功。
Linux 系统配置
对于 Linux 系统,除了前面提到的复制到项目lib
目录的方法,你也可以:
-
将库文件复制到 crypto-ffi 的 lib 目录:
bash# 替换{Hash}为实际的版本哈希值 cp /usr/local/openssl/lib/libcrypto.so.3 ~/.cjpm/git/crypto_ffi/{Hash}/lib/libcrypto.so cp /usr/local/openssl/lib/libssl.so.3 ~/.cjpm/git/crypto_ffi/{Hash}/lib/libssl.so
-
执行更新命令:
bashcjpm update
关于 cjpm 的 replace 配置
你可能会想,能不能通过配置让 cjpm 直接使用项目根目录下的 lib 文件夹中的库文件?这可以通过 cjpm.toml 中的 [replace] 配置来尝试。
在你的项目根目录的 cjpm.toml 文件中,可以添加类似这样的配置:
toml
[replace]
"crypto_ffi" = { path = "./lib" }
不过根据社区反馈和实际测试,这个配置有时可能不起作用。如果你遇到问题,建议还是使用前面介绍的方法,直接将库文件放到 crypto-ffi 的 lib 目录中。
如果你想了解更多关于 replace 参数的使用,可以参考仓颉社区的讨论:如何正确使用 cjpm 的 replace 参数覆盖依赖版本和路径?
总结
通过本文的步骤,你应该已经成功配置好了 crypto-ffi 库及其依赖的 OpenSSL 环境。总结一下主要步骤:
- 使用 cjpm 导入 crypto-ffi 库
- 下载并编译 OpenSSL 3.0.7
- 将编译好的库文件放到正确的位置
- 执行 cjpm update 更新配置
如果你在操作过程中遇到任何问题,可以查看终端输出的错误信息,通常这些信息会提示你问题所在。也可以到仓颉社区寻求帮助,那里有很多有经验的开发者可以提供支持。
现在,你可以在你的仓颉项目中愉快地使用 crypto-ffi 提供的加密功能了!
最后 openssl-win-x64 编译产物如下:
PS: openssl 比较特殊这是一个加密库,还是自行编译安全一点.比较谁也不想自己的加密库被植入后门。