gpt4 book ai didi

linux - 在 Linode 服务器上升级 openssl 但如何确定 'ENGINESDIR'

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:52 38 4
gpt4 key购买 nike

在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

最佳答案

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

-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 的黑洞中投入了几个小时,但无论如何它都是有教育意义的。

关于linux - 在 Linode 服务器上升级 openssl 但如何确定 'ENGINESDIR',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52033940/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com