GmSSL win10编译安装


Windows编译安装GmSSL

  • 准备编译环境
  • 编译之前有个问题得说一下
  • 编译安装GmSSL
    • 1.生成makefile文件
    • 2.安装到指定路径,比如第一步指定的--prefix=D:/C++/gmssl
  • 生成jni所需的动态链接库

准备编译环境

  1. 安装Visual Studio 2015,我使用的是vs2015安装的,过程基本没什么问题,也试过MinGW,遇到一些问题,后来还是用vs2015编译安装的
  2. 安装ActivePerl,百度搜一下去官网下载即可,我使用的是 ActivePerl5.26.1.2601 版本
  3. 安装nasm,网址https://www.nasm.us/

编译之前有个问题得说一下

直接编译的话可能会遇到如下错误

libcrypto-1_1.def : error LNK2001: 无法解析的外部符号 EVP_get_ciphernames
libcrypto-1_1.def : error LNK2001: 无法解析的外部符号 EVP_get_digestnames

处理方式是从gmssl.git 仓库中找到 names2.c,查看该文件的历史版本,原来的版本里面有如下代码,追加到该文件尾部即可。该文件在 GmSSL-master/crypto/evp/names2.c 路径下

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
static void cipher_name_len(const EVP_CIPHER *cipher, const char *from,
    const char *to, void *x)
{<!-- -->
    *((int *)x) += strlen(EVP_CIPHER_name(cipher));
}

static void cipher_name(const EVP_CIPHER *cipher, const char *from,
    const char *to, void *x)
{<!-- -->
    strcat((char *)x, EVP_CIPHER_name(cipher));
}

char *EVP_get_ciphernames(int aliases)
{<!-- -->
    char *ret = NULL;
    int len = 0;
    EVP_CIPHER_do_all_sorted(cipher_name_len, &len);

    ret = OPENSSL_zalloc(len);
    if (!ret) {<!-- -->
        return NULL;
    }

    EVP_CIPHER_do_all_sorted(cipher_name, ret);
    return ret;
}

char *EVP_get_digestnames(int aliases)
{<!-- -->
    return "sm3:sha1:sha256";
}

编译安装GmSSL

1.生成makefile文件

1
perl Configure VC-WIN64A --prefix=D:/C++/gmssl  --openssldir=D:/C++/gmssl/openssl
  1. –prefix指定gmssl安装路径
  2. –openssldir指定openssl路径
  3. 如果当前系统是64位使用VC-WIN64A,如果当前系统是32使用VC-WIN32

2.安装到指定路径,比如第一步指定的–prefix=D:/C++/gmssl

1
make
1
make install

此时会在D盘C++目录下生成gmssl目录,与在linux环境下编译安装类似,将可执行文件gmssl.exe复制到了gmssl/bin目录

生成jni所需的动态链接库

在前两步编译安装gmssl的过程较为顺利,只需将vs2015正常安装,然后执行3个命令即可。但是我在生成jni动态库的时候花了一天时间,主要被GmSSL github上面搜到的issue干扰了。上面有各种编译动态库的说明,用vs自带的cl编译,或者用mingw的gcc编译等等。我尝试了好多次,都遇到一些问题。后来我发现GmSSL-master/java/目录下有一个winmake文件,我想估计是windows下的makefile,我就把它重命名成makefile,然后使用vs2015自带的nmake
注意,执行nmake的时候不能使用windows+R调出cmd执行,得在vs2015里面找到"VS2015 x64本机工具命令提示符"里面执行,否则会报错找不到stdio.h
执行了一下,gmssljni.dll 动态库文件成功生成。浪费了一天时间,真是的。当我使用这个winmake文件生成动态库成功之后,我又使用

1
gcc -shared -fPIC -Wall -I./jni -I ../include -L ../ GmSSL.c -lcrypto -o libgmssljni.dll

命令执行了一下,发现此时生成 libgmssljni.dll 也可以了,真是无语了我,之前尝试了几个小时就是报错,提示一大堆

undefined reference to `OPENSSL_sk_num’

类似的错误,控制台都打印满了。在此,吐槽一下windows系统,记录下来,也给大家分享一下,希望大家在编译的时候能少走些弯路