仓颉crypto-ffi 库与 OpenSSL 环境配置完全指南

对于仓颉(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 系统配置

  1. 找到 crypto-ffi 在你的系统中的安装目录,通常是:%USERPROFILE%/.cjpm/git/crypto_ffi/{Hash}/lib

其中%USERPROFILE%是你的用户目录(类似C:\Users\你的用户名),{Hash}是一个由字母和数字组成的字符串,代表你安装的 crypto-ffi 版本。

  1. 将之前编译得到的libcrypto-3-x64.dlllibssl-3-x64.dll复制到这个目录。

  2. 重命名这两个文件:

    • libcrypto-3-x64.dll重命名为libcrypto.dll
    • libssl-3-x64.dll重命名为libssl.dll
  3. 更新项目配置:

    bash 复制代码
    # 在你的仓颉项目根目录执行
    cjpm update

    如果输出cjpm update success,说明配置成功。

Linux 系统配置

对于 Linux 系统,除了前面提到的复制到项目lib目录的方法,你也可以:

  1. 将库文件复制到 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
  2. 执行更新命令:

    bash 复制代码
    cjpm 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 环境。总结一下主要步骤:

  1. 使用 cjpm 导入 crypto-ffi 库
  2. 下载并编译 OpenSSL 3.0.7
  3. 将编译好的库文件放到正确的位置
  4. 执行 cjpm update 更新配置

如果你在操作过程中遇到任何问题,可以查看终端输出的错误信息,通常这些信息会提示你问题所在。也可以到仓颉社区寻求帮助,那里有很多有经验的开发者可以提供支持。

现在,你可以在你的仓颉项目中愉快地使用 crypto-ffi 提供的加密功能了!

最后 openssl-win-x64 编译产物如下:

openssl 下载

PS: openssl 比较特殊这是一个加密库,还是自行编译安全一点.比较谁也不想自己的加密库被植入后门。

相关推荐
沢田纲吉1 天前
《LLVM IR 学习手记(三):赋值表达式与错误处理的实现与解析》
前端·编程语言·llvm
希赛网4 天前
软考软件设计师常考知识点:(一)计算机组成与体系结构
软考·uml·编程语言·计算机基础·软件设计师
沢田纲吉8 天前
《LLVM IR 学习手记(二):变量表达式编译器的实现与深入解析》
前端·编程语言·llvm
Moonbit10 天前
MoonBit Pearls Vol.9:正则表达式引擎的两种实现方法:导数与 Thompson 虚拟机
后端·正则表达式·编程语言
沢田纲吉15 天前
《LLVM IR 学习手记(一):无量表达式编译器的实现与实践总结》
编程语言·llvm
Moonbit16 天前
MoonBit 三周年 | 用代码写就 AI 时代的语言答卷
后端·程序员·编程语言
阿里云云原生17 天前
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
编程语言
数据智能老司机17 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
Moonbit18 天前
用MoonBit开发一个C编译器
后端·编程语言·编译器