在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
答案 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
目录,因为它由两个名为INSTALLTOP
,LIBDIR
的目录组成。在INSTALL.md
文件(该文件位于openssl github repo中)中,只有被提及的用户可以使用--prefix
来更改前缀,但是在这些文件中,我发现还有其他未被提及但样式相同的参数可以更改LIBDIR
依赖ENGINESDIR
。也许它很少使用,所以markdown文件没有提及所有可能的参数。
非常感谢Reinier Torenbeek,没有他,我不会再考虑这个答案。也许这不是一个难题,但实际上我无法在遇到答案之前就解决它。我接受他的建议作为答案。