나는 온라인에서 검색하는 데 시간을 보냈지만 내가 찾은 것 중 아무것도 도움이 되지 않는 것 같습니다.
CentOS 6 64비트를 실행 중이고 mod_ssl을 사용하여 Apache를 컴파일하고 이를 내 OpenSSL 버전(OS에서 제공하는 것보다 최신 버전)에 연결하려고 합니다.
OpenSSL 1.1.0i는 다음과 같이 구성됩니다.
./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared
Apache 2.4는 다음과 같이 구성됩니다.
./configure --enable-layout=mycustomlayout \
--prefix=/opt/httpd-2.4.34 \
--exec-prefix=/opt/httpd-2.4.34 \
--with-mpm=prefork \
--enable-so \
--enable-ssl \
--with-ssl=/opt/openssl-1.1.0 \
--enable-cgi \
--enable-http2 \
--enable-proxy-http2 \
--with-included-apr
잘 컴파일되는 것 같지만 mod_ssl은 OpenSSL 1.1.0이 설치된 위치를 모릅니다.
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
따라서 이것은 어디를 볼 것인지 명시적으로 알려주는 경우에만 작동합니다.
[root@host .libs]# export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007f069149a000)
libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007f069100a000)
httpd 바이너리에 mod_ssl을 정적으로 구축하는 것조차 --enable-mods-static=ssl
도움이 되지 않습니다.
--enable-ssl
, --enable-ssl --enable-ssl-staticlib-deps
, 를 시도했지만 --enable-ssl --enable-ssl-staticlib-deps --enable-mods-static=ssl
여전히 동일한 결과가 나왔습니다.
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
또한 운 없이 다음 변수를 설정해 보았습니다 ./configure
.
export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
LDFLAGS="-L/opt/openssl-1.1.0/lib"
/etc/ld.so.conf.d
새로운 OpenSSL 라이브러리를 자동 로딩하는 기능을 추가하거나 Apache의 init 스크립트를 조정하여 이를 추가할 수 있다는 것을 알고 있지만 , PHP 빌드처럼 LD_LIBRARY_PATH
작동하도록 하고 프로그램이 libssl.so
/ 를 찾도록 하는 것이 더 좋습니다.libcrypto.so
[root@host php]# export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
LDFLAGS="-L/opt/openssl-1.1.0/lib" \
PHP_PREFIX=/opt/php-7.2.9 \
EXTENSION_DIR=$PHP_PREFIX/usr/lib64/php/modules
[root@host php]# ./configure […] \
--with-imap=shared \
--with-imap-ssl \
--with-openssl=shared \
--with-openssl-dir=/opt/openssl-1.1.0/bin
[root@host php]# make
[root@host php]# unset PKG_CONFIG_PATH LD_LIBRARY_PATH LDFLAGS
[root@host modules]# ldd ./openssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007fc2220a6000)
libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007fc221c17000)
내가 뭘 잘못했나요? 이것이 버그일까요?
답변1
LDFLAGS 환경 변수에 다음을 추가해 보세요.
-Bstatic -lssl -lcrypto
.so
또한 openssl libdir에 파일이 없고 정적 .a
파일만 있는지 확인하십시오. 이상적으로 이는 no-shared
openssl 구성에 매개변수를 전달하여 수행됩니다.
./configure
우리가 명시적으로 정적 버전을 요청하더라도 링커가 공유 버전을 선호하는 이유는 여전히 확실하지 않습니다. 그러나 이는 httpd의 스크립트가 라이브러리 종속성을 처리하는 방식과 관련이 있을 수 있습니다.
구성 스크립트의 패치가 더 깔끔할 수 있지만 .so
파일이 없다는 것만으로도 링커가 정적 버전을 선택하기에 충분한 것 같습니다.