在Linode服务器上升级openssl,但如何确定“ ENGINESDIR”

时间:2018-08-27 06:51:53

标签: linux openssl

在Linode Server上,它已经安装了openssl,但是版本为1.1.0。但是我想尝试一些功能,例如TLSv1_3,所以我决定将其升级到最新版本。

我的旧版openssl版本如下:

OpenSSL 1.1.0g  2 Nov 2017
built on: reproducible build, date unspecified
platform: debian-amd64
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/lib/ssl\"" -DENGINESDIR="\"/usr/lib/x86_64-linux-gnu/engines-1.1\"" 
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"

由于它是“升级”,所以我尝试保留尽可能原始的内容。通过某个网站,我执行了此./config命令。

./config --prefix=/usr --openssldir=/usr/lib/ssl threads shared zlib-dynamic no-ssl no-tls1 no-tls1_1 -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DENGINESDIR=/usr/lib/x86_64-linux-gnu/engines-1.1

很长,但重要的是最后一句话:-DENGINESDIR=/usr/lib/x86_64-linux-gnu/engines-1.1

当我使用make命令时发生了问题。这是错误消息:

<command-line>:0:0: warning: "ENGINESDIR" redefined
<command-line>:0:0: note: this is the location of the previous definition
crypto/cversion.c: In function 'OpenSSL_version':
<command-line>:0:13: error: 'usr' undeclared (first use in this function)
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:13: note: each undeclared identifier is reported only once for each function it appears in
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:17: error: 'lib' undeclared (first use in this function); did you mean 'ldiv'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:21: error: 'x86_64' undeclared (first use in this function); did you mean '__x86_64'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:34: error: 'gnu' undeclared (first use in this function)
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:38: error: 'engines' undeclared (first use in this function); did you mean 'engine_st'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
crypto/cversion.c:38:44: error: expected ';' before string constant
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                                        ^~~~

似乎将我的目录拆分为不同的参数...

就是这样,我的问题是我应该手动设置ENGINESDIR吗?如果我放弃-DENGINESDIR参数,那么ENGINES也可以指向/usr/lib/x86_64-linux-gnu/engines-1.1吗?还是有更好的选择?我对openssl并不熟悉,我只能从许多Google那里编写类似的命令。

PS1:我的新版openssl版本是1.1.1-pre9

2 个答案:

答案 0 :(得分:0)

openssl version -a的输出在以copmpiler:开头的行中提到

-DENGINESDIR="\"/usr/lib/x86_64-linux-gnu/engines-1.1\""

这与您所使用的相同,但是用双引号引起来,内部的引号转义了。

为了在config脚本中实现此目的,您将不得不转义双引号和反斜杠,因为一旦调用脚本,它们就会被扩展。调用config时,这应该可以解决问题:

-DENGINESDIR=\"\\\"/usr/lib/x86_64-linux-gnu/engines-1.1\\\"\"

更新

在OP回答自己的问题之后,我花了更多时间通过自己尝试其他方法来研究此问题。上面提出的方法确实消除了编译错误,并允许构建完成。但是,这不是正确的解决方案。

要对此进行深入研究,我使用以下命令设置了Makefile

$ ./config --prefix=/tmp/openssl -DENGINESDIR=\"\\\"/tmp/openssl-engines\\\"\"

此后进行make install时产生的结果包含许多行,如下所示:

gcc  -I. -Icrypto/include -Iinclude -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG
    -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC
    -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5
    -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM
    -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM
    -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM
    -DENGINESDIR="\"/tmp/openssl-engines\"" -DOPENSSLDIR="\"/tmp/openssl/ssl\""
    -DENGINESDIR="\"/tmp/openssl/lib/engines-1.1\"" -Wall -O3 -pthread -m64
    -DL_ENDIAN  -Wa,--noexecstack -fPIC -DOPENSSL_USE_NODELETE
    -MMD -MF crypto/bn/bn_div.d.tmp -MT crypto/bn/bn_div.o -c
    -o crypto/bn/bn_div.o crypto/bn/bn_div.c
<command-line>:0:0: warning: "ENGINESDIR" redefined
<command-line>:0:0: note: this is the location of the previous definiti

请注意,-DENGINESDIR出现了两次,因此发出警告。最后一个优先于第一个,因此不会产生预期的结果。

进一步的调查显示,就像在他的回答中指出的OP一样,Makefile具有“硬编码”行ENGINESDIR=$(libdir)/engines-1.1,该行不能被覆盖并且正在阻止对此方面进行定制。因此,将-DENGINES值与Configure一起使用是没有用的。

无需过多说明:要使ENGINESDIR的值可配置,必须修改文件Configurations/unix-Makefile.tmpl以包含以下几行,类似于openssldir设置的那些行:

ENGINESDIR={- use File::Spec::Functions;
              our $enginesdir =
                  $config{enginesdir} ?
                      (file_name_is_absolute($config{enginesdir}) ?
                           $config{enginesdir}
                           : catdir($prefix, $config{enginesdir}))
                      : catdir($prefix, "engines");
              $enginesdir -}

,需要在Configure文件中添加几行内容,以引入实际的--enginesdir参数。

这样做之后,以下命令序列按预期方式工作:

$ ./config --prefix=/tmp/openssl --enginesdir=/tmp/openssl-engines
$ make && make install && make install_engines

这完全超出了OP的要求,我花了几个小时进入称为OpenSSL的黑洞,但这还是很有教育意义的。

答案 1 :(得分:0)

经过一段时间的搜索,我终于找到了答案。 当您急于解决问题但完全没有任何感觉时,但是如果您无意间经过了几天,又随机回来思考并再次搜索,您将找到答案,答案是多么接近。 密钥文件是Makefile,它位于您尝试使用.../openssl-OpenSSL_1_1_1-pre9/命令的类似make的目录中,有些段落突然跳入我的视线,并立即吸引了我:

# Do not edit these manually. Use Configure with --prefix or --openssldir
# to change this!  Short explanation in the top comment in Configure
INSTALLTOP=/usr
OPENSSLDIR=/usr/lib/ssl
LIBDIR=lib
# $(libdir) is chosen to be compatible with the GNU coding standards
libdir=$(INSTALLTOP)/$(LIBDIR)
ENGINESDIR=$(libdir)/engines-1.1

看看ENGINESDIR的编写样式并与我的命令关联,很快我就意识到了这些目录之间关系的关键。

所以我修改了命令,删除了原始的-DENGINESDIR并添加了一些make命令,如下所示:

./config --prefix=/usr --openssldir=/usr/lib/ssl --libdir=lib/x86_64-linux-gnu ...

再次

make,奇迹发生了,过去了,没有任何错误,甚至没有警告。我尝试make test,它也通过了,只跳过了一些东西,但这是正常的。

尽管我不尝试make install来验证ENGINES是否指向我的旧目录。但我认为应该没事。

所以关键是不要手动设置ENGINES目录,因为它由两个名为INSTALLTOPLIBDIR的目录组成。在INSTALL.md文件(该文件位于openssl github repo中)中,只有被提及的用户可以使用--prefix来更改前缀,但是在这些文件中,我发现还有其他未被提及但样式相同的参数可以更改LIBDIR依赖ENGINESDIR。也许它很少使用,所以markdown文件没有提及所有可能的参数。

非常感谢Reinier Torenbeek,没有他,我不会再考虑这个答案。也许这不是一个难题,但实际上我无法在遇到答案之前就解决它。我接受他的建议作为答案。