GmSSL是一个开源密码工具包,为GM/T系列标准中规定的中国国家密码算法和协议提供一级支持。作为OpenSSL项目的一个分支,GmSSL提供了与OpenSSL的API级兼容性,并维护了所有功能。现有的项目,如ApacheWeb服务器,只需稍加修改和简单的重建,就可以轻松地移植到GmSSL。自2014年底首次发布以来,GmSSL已被开源中国推荐的六个加密项目之一,并获得2015年中国Linux软件奖。
在 App Store
上安装 Xcode
此步骤略过,自行安装
下载 GmSSL 软件包或拉取该项目
项目地址:https://github.com/guanzhi/GmSSL.git
如果下载的 zip
压缩包,请自行解压
编译并安装
进入 GmSSL
cd GmSSL
文件修改
添加 arm64 编译选项
由于 Mac
下编译的 GmSSL
为 x86
或i386
架构,而 M1
使用了 arm64
架构,编译文件中并未提供 Mac arm64
架构的编译配置,所以需要修改 Configurations/10-main.conf
,在文件末尾 );
内添加如下内容:
"darwin64-arm64-cc" => {
inherit_from => [ "darwin-common", asm("aarch64_asm") ],
cflags => add("-arch arm64 -DL_ENDIAN -Wall -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK)"),
bn_ops => "SIXTY_FOUR_BIT_LONG",
perlasm_scheme => "macosx",
shared_ldflag => "-arch arm64 -dynamiclib",
},
位置参考:
修改 Configure
和 test/build.info
由于编译过程中可能会遇到 this system (darwin64-x86_64-cc) is not support
错误,这也在GmSSL
项目的 issue
中所提到https://github.com/guanzhi/GmSSL/issues/811
解决方案如下:
将 Configure
文件与 test/build.info
文件中的
use if $^O ne "VMS", 'File::Glob' => qw/glob/;
修改为
use if $^O ne "VMS", 'File::Glob' => qw/:glob/;
修改 engines/afalg/e_afalg.c 文件
编译过程中还会遇到 engines/afalg/e_afalg.c:110:20: error: '__NR_eventfd' undeclared (first use in this function); did you mean 'eventfd'?
错误
解决方案:
方案一:
找到 static ossl_inline int eventfd(int n)
函数,将内容改为如下:
static ossl_inline int eventfd(int n)
{
return syscall(__NR_eventfd2, n);
}
方案二:
# 在编译时,添加如下参数,此方案未尝试过,请自行食用
sudo ./config -DGMSSL_NO_TURBO no-afalgeng
编译配置
tips:
- 如果需要与
OpenSSL
共存,则需要指定GmSSL
的安装路径- 同时需要添加
no-shared
参数:只编译静态库
- 设置环境变量
export CC=clang
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export CROSS_SDK=MacOSX.sdk
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
- 编译配置
# --prefix 指定 gmssl 的安装路径
# --openssldir 表示 OpenSSL 数据区域,例如openssl.cnf,证书和密钥. 如果是相对目录,它将被添加到--prefix给定的目录中。【可以不指定,默认在 --prefix 同级目录的 ssl 目录】
# no-shared 表示只编译静态库,不编译动态库
./Configure darwin64-arm64-cc --prefix="/usr/local/gmssl" no-asm no-shared -DGMSSL_NO_TURBO enable-ec_nistp_64_gcc_128
安装
# 如果需要加快编译速度,可根据实际情况使用 -j 参数指定可同时执行命令的数量,如 make -j 16 表示可同时执行 16 个命令,但受限于CPU的核心数
make
# 安装(如果有旧版本,可以使用 make uninstall 卸载,然后删除对应文件)
make install
添加环境变量
如果未指定安装目录,则不需要此步骤
# 添加环境变量
echo 'export PATH="$PATH:/usr/local/gmssl/bin"' >> ~/.bash_profile
source ~/.bash_profile
验证
$ gmssl version -a
GmSSL 2.5.4 - OpenSSL 1.1.0d 19 Jun 2019
built on: reproducible build, date unspecified
platform: darwin64-arm64-cc
compiler: cc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_PIC -DGMSSL_NO_TURBO -DOPENSSLDIR="\"/usr/local/gmssl/ssl\"" -DENGINESDIR="\"/usr/local/gmssl/lib/engines-1.1\""
OPENSSLDIR: "/usr/local/gmssl/ssl"
ENGINESDIR: "/usr/local/gmssl/lib/engines-1.1"
问题集锦
- 出现
assert.h file not found
错误
crypto/aes/aes_core.c:39:10: fatal error: 'assert.h' file not found
此问题是由于 MacOSX.SDK
环境变量设置错误,或没有安装 Xcode app
,如果没有安装 Xcode
,则需要将编译步骤中的环境变量:
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export CROSS_SDK=MacOSX.sdk
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
根据实际情况指定到正确的目录位置,如 /Library/Developer/CommandLineTools/SDKs/
目录下(但此方法未做尝试,自行食用)
安装过程中,可能会出现其他问题,欢迎提出讨论!